1

System.ValueType 是一个类,从它派生的所有内容都是值类型,因此不能是类,因为类是引用类型。

System.Enum(继承 System.ValueType)怎么可能被定义为一个类呢?

4

2 回答 2

2

请参阅:http: //msdn.microsoft.com/en-us/library/system.valuetype.aspx

尽管 ValueType 是值类型的隐式基类,但您不能创建直接从 ValueType 继承的类。相反,各个编译器提供语言关键字或构造(例如 C# 中的 struct 和 Visual Basic 中的 Structure...End Structure)来支持值类型的创建。

针对您的问题:

那么说所有类都是引用类型是错误的吗?

您声明的任何类都将是引用类型。所以我不认为将所有类都视为引用类型是错误的。创建一个声明为类的值类型是不可能的。您必须使用 struct 关键字。如果您尝试模拟您在 enum 类中看到的内容:

  public class Test: ValueType
  {
      public string Text { get; set; }
  }

...您将收到错误“测试”无法从特殊类“System.ValueType”派生。我不知道是什么魔法使“ValueType”类变得特别,但据我所知,所有 .NET 语言都要求您使用特殊关键字,例如struct定义自己的值类型。它令人困惑,但可能用于重要目的,例如优雅地处理装箱/拆箱、反射(.IsValueType?)和类似的事情。

如果你有一个抽象类,你不能实例化它,所以它永远不会在堆上,即。不会像引用类型一样?

是的,但这与 ValueTypes 完全不同。你可以声明一个像 int 这样的 ValueType,给它赋值,传递它,它可以被拆箱和装箱。这些东西都不适用于抽象类。

顾名思义,它是其他一些具体类的抽象。当你声明一个 SomeAbstractClass 类型的变量时,你不能对它做任何事情,直到你初始化它对继承该抽象类的某个具体类的引用。因此,与该变量的每个操作/交互都将针对具体类发生(尽管它可能会利用抽象类中的一些实现)。因此,每当您使用抽象类变量时,您实际上是在使用具体类,因此它仍然是一个引用类型,并且所有像堆这样的东西都适用于它,就像任何其他引用类型一样

于 2013-03-13T00:11:30.490 回答
2

.NET 中的所有内容都派生自 System.Object:

引用类型和值类型都派生自最终的基类 Object。如果值类型必须表现得像对象,则在堆上分配一个使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。包装器被标记以便系统知道它包含一个值类型。这个过程称为装箱,相反的过程称为拆箱。装箱和拆箱允许将任何类型视为对象。

http://msdn.microsoft.com/en-us/library/system.valuetype(v=vs.110).aspx

于 2013-03-13T00:12:54.213 回答