当我第一次看到 C# 中的值类型时,我想到的第一件事是“哇,多么棒的优化”,第二件事是,“我们真的需要一种新的语言结构吗?我们不能用注释代替?”。
想法是,给定一个类,我们将像往常一样使用它
class A {int i;}
class B {
A m_a;
int F(A a) {m_a = a;}
}
我们会随心所欲地改变 A
成为
[ValueType]
class A {int i;int j;}
并且编译器会自动转换class B
成为
class B {
#region A
int A_i;
int A_j;
#endregion
int F(/*A param*/int i,int j) {
#region A_assign
A_i = i;
A_j = j;
#endregion
}
请记住,如果编译器不想优化某些实例 - 它不必这样做。无论哪种方式都可以。
模板可能会出现问题,
int f<T>() {
T t; // how much stack should I allocate
}
但我不确定它是否比当前情况更糟糕。我实际上不确定现在会发生什么(f<struct_of_100_bytes>
是一个与 f<int>
不同的函数吗?)。
最佳答案
现在想象一下继承。或数组。或争论。或泛型。或者实现一个接口(interface)。或者分配给对象/动态。
请记住,运行时支持多个编译器。
拥有一个特定的关键字(结构)而不是一个属性并不是一个很大的变化(实际上,就 CLI 而言,一切都称为类),但总体情况比您的示例复杂得多。
基本上,struct 几乎可以完成您提到的所有事情,并且适用于列出的所有场景。由于它通常(对于本地人)使用堆栈,因此它的行为已经很像您描述的那样。
关于“分离功能”的问题;首先,泛型不是"template"(它是运行时与编译时)。但是泛型为每个值类型获得一个 JIT,为每个引用类型获得一个 JIT(因为确实:堆栈布局发生了变化。
关于c# - 值类型可以通过内联来实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376917/