[英]Where do i find the ValueType constructor in .net source code?
可能看起來沒意思,但我正在學習C#,並正在研究ValueType類。 它在此處http://msdn.microsoft.com/zh-cn/library/system.valuetype.valuetype(v=vs.110).aspx中表示,構造函數的語法是“ protected ValueType()”。
我的問題是我在哪里可以在源代碼中實際看到此構造函數? 我環顧四周,找不到它。 我發現的最接近的東西是在“類型類”中,但后來我無法確定類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類是抽象的。
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
除了作為使.NET中的類模型完整的理論外, ValueType
的構造函數不存在。
ValueType
類的構造函數將永遠不會被調用,因為值類型永遠不會被視為一個類。 當實現值類型時,您可以將其作為struct
,盡管它可以具有構造函數,但這與類構造函數不同,並且在使用struct
構造函數時不會調用ValueType
構造函數。
ValueType
類用作可在struct
上使用的方法的容器,編譯器會處理使struct
正常工作的所有內容,就像它繼承自ValueType
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.