[英]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
的源代碼中的某些內容將無法按原樣編譯。
我的猜測是您遇到過其中之一。 Single
是float
的同義詞,它本身是一個原始類型。 源代碼可能不是實際編譯/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 設計器時。
使用靜態和常量,這甚至都不是問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.