簡體   English   中英

在.net源代碼中的哪里找到ValueType構造函數?

[英]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用於枚舉裝箱一樣)。 它為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

除了作為使.NET中的類模型完整的理論外, ValueType的構造函數不存在。

ValueType類的構造函數將永遠不會被調用,因為值類型永遠不會被視為一個類。 當實現值類型時,您可以將其作為struct ,盡管它可以具有構造函數,但這與類構造函數不同,並且在使用struct構造函數時不會調用ValueType構造函數。

ValueType類用作可在struct上使用的方法的容器,編譯器會處理使struct正常工作的所有內容,就像它繼承自ValueType

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM