.NET中的值类型如何实际工作?

时间:2012-10-16 19:08:08

标签: c#

我在理解.NET中的值类型表示时遇到问题。 每个值类型都派生自System.ValueType类,这是否意味着Value Type是一个类?

例如,如果我写:

int x = 5;

这意味着我创建了一个System.Int32类的实例'将它写入变量x ??

4 个答案:

答案 0 :(得分:6)

System.ValueType类实际上只是一个“元”类,内部处理方式与普通类不同。结构和原始类型隐式继承System.ValueType,但该类型在运行时实际上并不存在,它只是程序集标记类应被视为值类型结构并采用按值传递语义的一种方式。

与其他答案相反,值类型并不总是在堆栈上分配。当它们是类中的字段时,它们就像实例化该对象时的其余类数据一样位于堆上。在迭代器或闭包中使用时,局部变量也可以提升为隐式类。

答案 1 :(得分:1)

请参阅Eric Lippert's article

简而言之,值按值复制。值类型就像引用类型一样,值类型的实例是对象。 5是一个对象,System.Int32的实例(简称int)。

答案 2 :(得分:0)

现在,有很多话题要谈。说真的,网上有关于这个主题的数百页,其中大部分以惊人的速度烧伤我的脑部。

我实际记得的是,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++;
}

答案 3 :(得分:-1)

值类型不是类。这些是内置类型的语言,由.NET CTS(通用类型系统)处理。 CTS是CLR中的一个组件,负责处理值类型,如bool,int,double,float等。 当您创建值类型的对象时,它将在堆栈上创建。当您将它传递给函数或从函数返回时,然后在ram中为它创建一个新对象。但是在引用类型的情况下,仅传递对象的引用,并且不在内存中创建新对象。 有一些用户定义的值类型不在语言规范中,由用户定义。此类值类型继承自System.ValueType。 这种值类型的示例是复数。我们可以使用System.ValueType。

创建我们自己的用户定义类型的复数