2013-06-19 108 views
-2

我可以定義一個擴展方法,以確定是否一個對象爲空擴展方法中「T」(TArg0,TEnum,TInt)的含義是什麼?

public static bool IsNull(this object obj) { 
    if (obj == null) 
     return true; 
    else return false; 
} 

但我也可以這樣做:

public static bool IsNull<T>(this T obj) { 
    if(obj == null) 
     return true; 
    else return false; 
} 

兩者都被應用到每一個對象。這個T的目的是什麼?爲了進一步闡述預期的類型?如果是,爲什麼這樣:typeof(T)是可能的? 背後的原因是什麼(this T obj) where T: int)其中)那麼呢?不管怎麼樣,正如@MatthewWatson指出的那樣)

這麼多問題。

+0

你不能有'where T:int',這是一個編譯錯誤。你在哪裏看到的? –

+3

您是否閱讀了手冊(http://msdn.microsoft.com/zh-cn/library/twcad0zb%28v=vs.110%29.aspx)[第一頁](http://msdn.microsoft.com /en-us/library/d5x73970.aspx)? – Jon

+1

[泛型類型參數](http://msdn.microsoft.com/en-us/library/0zk36dx2.aspx)和[對類型參數的約束](http://msdn.microsoft.com/en-us/library /d5x73970.aspx) – Oded

回答

3

T表示通用。這意味着該類型是未知的。默認情況下,它的一個對象就是.Net中的一個對象。但是,你可以用範式來專注於T。例如,其中T是IDisposable。那麼你的函數將只適用於IDisposable類型。

1

T歷史意味着Type。它被慣例用來定義泛型(在C++ - 模板中)參數。 在你的例子中,它不是必需的,因爲.NET基礎結構中的任何對象都繼承了基地object

但是記得C++的美好時光,當C#甚至沒有被引入時。 C++只有普通類型,沒有公共父項(即object)。所以開發人員不得不使用一些東西來告訴編譯器「這裏有些東西會被替換,實際上我不知道究竟是什麼,但是後來在編譯時它會很清楚,請爲我做。」

回到符號,在MFC中使用另一個前綴 - CCString

UPD:你第一個例子就不會工作,因爲它是延伸和null對象有沒有什麼方法,即使你IsNull

UPD1:不要讀UPD以上,蛋糕是謊言。

+2

@AlexGP你是什麼意思的「不會工作」?它工作得很好:'String myObj = null; Console.WriteLine(myObj.IsNull)'==>「True」 – Atrotygma

+1

@Alex:這是不正確的,你可以看看http://stackoverflow.com/questions/847209/in-c-what-happens-when-你可以通過調用一個擴展方法來解釋一個null對象。 – srsyogesh

+0

@Atrotygma啊,你的地區絕對正確,我怕有點空= = –

相關問題