在.net源代码中的哪里可以找到ValueType构造函数

本文关键字:ValueType 构造函数 源代码 net | 更新日期: 2023-09-27 18:26:16

可能看起来不感兴趣,但我正在学习C#,并且正在研究ValueType类。上面写着http://msdn.microsoft.com/en-us/library/system.valuetype.valuetype(v=vs.110).aspx,构造函数的语法为"protected ValueType()"。

我的问题是,在源代码中,我在哪里可以真正看到这个构造函数?我环顾四周,找不到它。我找到的最接近的东西是在"Type Class"中,但后来我无法识别类ValueType和类Type之间的连接。。。

在.net源代码中的哪里可以找到ValueType构造函数

您在任何地方都找不到它。可能在ValueType类的.NET Framework参考源中找到了它,但它不包含任何构造函数,它只是将ValueType定义为abstract class,并使用隐式编译器生成的构造函数。因为类是abstract,所以隐式构造函数是protected

你也可以在自己的类型中看到这一点:

using System;
using System.Reflection;
abstract class C { }
static class Program {
  static void Main() {
    // prints nothing: C has no public constructor
    Console.WriteLine(typeof(C).GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null));
    // does print: C does have a non-public constructor
    Console.WriteLine(typeof(C).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null));
  }
}

您在源代码中找不到它。这是正常的,类不必显式声明构造函数。如果没有提供,C#编译器会自动生成一个。在这种情况下,调用基构造函数System.Object是必需的。

它受到保护,因为ValueType类是抽象的。

ValueType的构造函数除了作为一种理论使.NET中的类模型完整之外,并不存在。

ValueType类的构造函数永远不会被调用,因为值类型永远不会被视为类。当您实现一个值类型时,您可以将其作为struct来实现,尽管它可以有一个构造函数,但这与类构造函数不同,并且在使用struct构造函数时不会调用ValueType构造函数。

ValueType类充当可以在struct上使用的方法的容器,编译器处理使struct工作的一切,就像它继承自ValueType一样。

在该类型的源代码中没有定义构造函数。

MSDN说构造函数是protected,但这是类是abstract的结果。这是隐含的。

ValueType是一个仅用于装箱目的的类(就像Enum用于枚举装箱一样)。它为EqualsGetHashCode提供了不同的默认实现,仅此而已。这些方法是虚拟的,在装箱值类型的类层次结构中插入ValueType将使CLR能够将这些方法的调用解析为更合适的实现,因为两个相同的装箱值应被视为相等,而不是两个完全相同的类实例,其在默认情况下将使用引用相等。

我认为您不必担心它,因为它更像是一个实现细节,而不是其他任何东西。

另一方面,Type类用于反射目的。它表示类型系统中的一个类型(如类/结构/接口)。typeof(SomeType)将返回一个Type实例,someInstance.GetType()也将返回。

一些测试用例:

object boxed = 42;
Console.WriteLine(boxed.GetType().FullName);                            // System.Int32
Console.WriteLine(typeof(ValueType).IsAssignableFrom(boxed.GetType())); // True