簡體   English   中英

C# 值類型如何包含自己類型的字段?

[英]C# How do value types contain fields of their own type?

我試圖更多地了解值類型是如何在 C# 中實現和表示的,當我看到 Single struct/value 類型被定義為這樣時感到困惑:

public struct Single : IComparable, IComparable<Single>, IConvertible, IEquatable<Single>, IFormattable
{
    public const Single Epsilon = 1.401298E-45F;
    public const Single MaxValue = 3.40282347E+38F;
    public const Single MinValue = -3.40282347E+38F;
    public const Single NaN = 0F / 0F;
    public const Single NegativeInfinity = -1F / 0F;
    public const Single PositiveInfinity = 1F / 0F;

    // etc ...
}

結構 Single 本身如何包含 Singles? 或者換句話說,類型的定義如何包含該類型的實例? 如果我嘗試使用自己的結構來執行此操作,編譯器會返回錯誤。 是不是實際的底層值是 C++ 原語,而“值類型”只是圍繞它的方法的集合? 我認為最終我對“原始”和“價值類型”之間的區別感到困惑。 如果它們是原語,為什么將它們定義為結構?

如果您嘗試此操作,編譯器會抱怨您的結構無法設為const (“類型 'MyStruct' 無法聲明為 const ”)。

我曾經問過一個關於decimal的類似問題 Jon Skeet 自己給出的答案是,如果沒有“一些有趣的 hack”, mscorlib的源代碼中的某些內容將無法按原樣編譯。

我的猜測是您遇到過其中之一。 Singlefloat的同義詞,它本身是一個原始類型。 源代碼可能不是實際編譯/CLR 類型的干凈抽象。

任何類型都可以在其代碼中使用自己。

這條規則從 Object 面向編程的早期就已經存在。 您可以在 C++ 中看到它,其中聲明和定義之間存在明顯差異: http://www.cplusplus.com/articles/yAqpX9L8/

基本上你可以聲明在這個代碼(或另一個文件)的某個地方,有一個“變量X”的定義。 然后可以使用“變量 X”,就好像你已經用包含指令或完全定義的那樣把它放在那里。 這樣您就可以制作類似於部分文件的內容。

對於功能,該過程稱為“原型設計”。

類可以在一定范圍內做到這一點。 在 C++ 中,您本身不能擁有類型本身的字段,因為這意味着每個實例都將包含另一個實例,從而導致編譯器遞歸。 並將類型膨脹到無限大小 但是,您可以擁有該類型的指針 在 .NET 我們有參考。 由於指針和引用都可以是 null,所以沒有問題。 可能在運行時包含一個引用遞歸。 但它不在編譯時,這對編譯器來說已經足夠好了。

但是這些過程是必要的,因為 Native C++ 編譯方法的特殊性:每個文件都在另一個文件之后編譯。 並且包含指令實際上插入了代碼,確實使預處理器和編譯器之間的文件大小膨脹。

//Prototype of a function
double someFunction( double, int );

//Declaration of a variable
extern int y;

問題是,當 C# 編譯器被制造出來時,它們已經超越了對原型和聲明的需求 可以看出,在這個文件或其他文件中有一個“Single”類型的定義,所以它可以使用“Single”類型。 包括 Single 本身的代碼。 確實如此,每次您使用部分 class - 所以每次您使用 Windows Forms 設計器時。

使用靜態和常量,這甚至都不是問題:

  • 靜態數據存儲在 class 實例之外。 它們位於 memory 中的某個位置,但編譯器會處理這些問題。 最重要的是,它們只出現一次。 沒有遞歸的危險。
  • 雖然編譯時常量,只會將值寫入生成的 MSIL。 同樣,沒有存儲在 class 中。

暫無
暫無

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

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