我在理解 .NET 中的值类型表示时遇到了问题。每个 Value Type 都派生自 System.ValueType 类,那么这是否意味着 Value Type 是一个类?
例如,如果我写:
int x = 5;
这意味着我创建了一个System.Int32
类的实例并将其写入变量 x??
我在理解 .NET 中的值类型表示时遇到了问题。每个 Value Type 都派生自 System.ValueType 类,那么这是否意味着 Value Type 是一个类?
例如,如果我写:
int x = 5;
这意味着我创建了一个System.Int32
类的实例并将其写入变量 x??
System.ValueType 类实际上只是一个“元”类,其内部处理方式与普通类不同。结构和原始类型隐式继承 System.ValueType,但该类型在运行时实际上并不存在,它只是程序集标记应将类视为值类型结构并采用按值传递语义的一种方式。
与其他答案相反,值类型并不总是在堆栈上分配。当它们是类中的字段时,它们就像实例化该对象时的其他类数据一样位于堆上。当在迭代器或闭包中使用时,局部变量也可以提升到隐式类中。
请参阅Eric Lippert 的文章。
简而言之,值类型是按值复制的。值类型就像引用类型一样是类,值类型的实例是对象。5
是一个对象,是System.Int32
(int
简称)的一个实例。
现在,有很多话要说。说真的,网上关于这个话题的内容大约有数百页,其中大部分都以惊人的速度烧毁了我的大脑。
我真正记得的是,int 和 Int32 是同一个东西,两者都像一个结构,而不是一个类。“int”是 Int32 的快捷方式。(如果将鼠标放在一个 int 上,工具提示会显示为“struct System.Int32”。这意味着:
public class BoxedInt
{
public int x;
public BoxedInt(int i) { x = i; }
}
public Test()
{
BoxedInt bi = new BoxedInt(10);
Boxed(bi);
Console.WriteLine(bi.x); // Returns 11, as any reference type would.
int vi = 10;
Valued(vi);
Console.WriteLine(vi); // Returns 10, because it acts like a struct. (Which it is)
}
public void Boxed(BoxedInt i)
{
i.x++;
}
public void Valued(int i)
{
i++;
}
值类型不是类。这些是语言中的内置类型,由 .NET CTS(通用类型系统)处理。CTS 是 CLR 内部的一个组件,它负责处理值类型,如 bool、int、double、float 等。当您创建值类型的对象时,它会在堆栈上创建。当您将它传递给函数或从函数返回时,会在 ram 中为它创建一个新对象。但是在引用类型的情况下,只传递对象的引用并且不会在内存中创建新对象。有一些用户定义的值类型不在语言规范中,而是由用户定义的。此类值类型继承自 System.ValueType。这种值类型的示例是复数。我们可以使用 System.ValueType 创建我们自己的用户定义的复数类型。