大山的LabVIEW/TestStand分享大山的LabVIEW/TestStand分享

面向 LabVIEW 与 TestStand 的个人知识分享站

LabVIEW vs C#:变体与泛型

LabVIEW vs C#:变体与泛型

泛型是 C# 最重要的类型系统特性——理解泛型,就理解了 .NET 标准库的设计根基

泛型,变体
发布时间:2026-08-08阅读时长:25 分钟浏览 50访客仅可浏览正文内容
LabVIEW 中类似的概念
C# 泛型
泛型类
//  = 类型占位符,T 可以是任何名字(惯例用 T)
public class DataStore<T>
{
    private List<T> _items = new();      // List 也泛型化:里面装什么类型取决于 T
                                         // C#9.0+简洁写法,= new List<T>()
                                         //名称前下划线是C#命名习惯,表示私有字段
    public void Add(T item)
        => _items.Add(item);             // T 类型进来

    public T Get(int index)
        => _items[index];                // T 类型出去
}
指定类型
// 存 double 的仓库
var numStore = new DataStore<double>();
numStore.Add(3.14);
double d = numStore.Get(0);       // 取出来就是 double,不需要转换

// 存 string 的仓库
var strStore = new DataStore<string>();
strStore.Add("Hello");
string s = strStore.Get(0);       // 取出来就是 string

// 存自定义对象的仓库
var sensorStore = new DataStore<Sensor>();
sensorStore.Add(new Sensor { Name = "T1" });
Sensor sensor = sensorStore.Get(0);
泛型方法
// 泛型方法:交换任意类型的两个值
static void Swap<T>(ref T a, ref T b)
//ref表示参数"按引用传递"。方法内部对 a 和 b 的修改,会反映到外部的原变量上,和 LabVIEW 的 DVR 一样
{
    T temp = a;
    a = b;
    b = temp;
}

// 使用:同一个方法,适配所有类型
int x = 1, y = 2;
Swap<int>(ref x, ref y);            // x=2, y=1

string s1 = "Hello", s2 = "World";
Swap<string>(ref s1, ref s2);       // s1="World", s2="Hello"

// 甚至能自动推断类型——省略  编译器也能猜到
Swap(ref x, ref y);                  // 等价于 Swap<int>
多种泛型约束
// T 必须实现 ICalibratable 接口(对标 LabVIEW Interface)
public class CalibrationRunner<T> where T : ICalibratable
{
    public void Run(T device)
    {
        device.Calibrate();   // 因为 T : ICalibratable,所以能调用 Calibrate()
    }
}

// T 必须是引用类型(class 约束)
public class Repository<T> where T : class { ... }

// T 必须有默认构造函数(new() 约束)
public class Factory<T> where T : new()
{
    public T Create() => new T();
}

// 多个约束可以叠加
public class Processor<T> where T : Sensor, ICalibratable, new()
{ ... }
Variant.png
LabVIEW中的Variant的“装箱”与“拆箱”
特性LabVIEW VariantC# 泛型 <T>
类型检查时机运行时(Variant To Data 失败 = 报错)编译时(写错类型 = 编译不过)
取数据手动 Variant To Data + 选目标类型直接取出,无需转换
性能装箱 / 拆箱有 CPU 开销零装箱,原生性能
代码简洁度存和取都需要额外的转换 VI和普通类写法完全一致
适用场景不同数据类型混用、动态类型场景明确类型、追求性能和安全

附件下载

留言区

只有注册用户可以留言和下载附件。立即注册已有账号,去登录
正在加载留言...