簡體   English   中英

為什么未裝箱的類型具有方法?

[英]Why do unboxed types have methods?

你為什么可以做這樣的事情

int i = 10;
i.ToString();
'c'.Equals('d');
1.ToString();
true.GetType();

在C#中? 這些東西要么是原始的,文字的,未裝箱的,要么是這些東西的任意組合。 那為什么有方法呢? 它們不是對象 ,因此不應具有方法。 該語法是否還可以用於其他用途? 如果是這樣,該怎么辦? 我可以理解具有執行這些操作的功能,例如:

string ToString(int number)
{
  // Do mad code
  return newString;
}

但在那種情況下,您可以將其稱為函數而不是方法:

string ranch = ToString(1);

這里發生了什么?

編輯:

剛剛意識到C#不再是Java克隆了,規則完全不同。 哎呀:P

他們之所以這樣,是因為規范是這樣說的(而且非常不錯):

1.28值類型

值類型可以是結構類型或枚舉類型。 C#提供了一組稱為簡單類型的預定義結構類型。 簡單類型通過保留字標識。

...

1.28.4簡單類型

C#提供了一組稱為簡單類型的預定義結構類型。 簡單類型通過保留字標識,但是這些保留字只是System名稱空間中預定義結構類型的別名,如下表所述。

...

因為簡單類型為結構類型別名,所以每個簡單類型都有成員。 例如,int具有在System.Int32中聲明的成員以及從System.Object繼承的成員,並且允許以下語句:

 int i = int.MaxValue; // System.Int32.MaxValue constant string s = i.ToString(); // System.Int32.ToString() instance method string t = 123.ToString(); // System.Int32.ToString() instance method 

簡單類型與其他結構類型的不同之處在於它們允許某些附加操作:

大多數簡單類型都允許通過編寫文字來創建值(第1.16.4節)。 例如,123是int類型的文字,而'a'是char類型的文字。 C#通常不提供結構類型的文字,而其他結構類型的非默認值最終總是通過這些結構類型的實例構造函數創建的。

正如規范說明的那樣,簡單類型具有一些超能力,例如具有const的能力,可以使用替代新的特殊文字語法以及在編譯時要進行計算的能力(2 + 2實際上在最終語言中寫為4)。 MSIL流)

但是方法(以及運算符)不是特殊的超級能力,所有結構都可以擁有它們。

可以從Microsoft網站下載該規范(對於C#4.0,我的復制粘貼來自早期版本): C#語言規范4.0

埃里克·利珀特(Eric Lippert)在最近的文章《 繼承與表示》中作了解釋(擾流器:您在混淆繼承與表示。)

不知道為什么要聲明整數i ,字符'c'和整數1不是對象。 他們是。

在C#中,所有基本類型實際上都是結構。

這樣就可以使用它們了!

這樣做很方便,因此可以。

現在,為了這樣做,可以將原語視為結構。 例如,可以將32位整數作為32位整數處理,但也可以將其作為public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int> 我們大多都能兼得。

暫無
暫無

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

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