在.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之间的连接。。。
您在任何地方都找不到它。可能在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
用于枚举装箱一样)。它为Equals
和GetHashCode
提供了不同的默认实现,仅此而已。这些方法是虚拟的,在装箱值类型的类层次结构中插入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