2016-02-15 151 views
0

我發現對於解釋通用java的類型,但我不知道有Java和.NET的泛型類型「Generic Type」是什麼意思?在.NET:x.GetType()IsGenericType

例如之間的主要區別我運行以下,但我無法找到它的真正含義。

List<int> list = new List<int>(); 
    Console.WriteLine(list.GetType().IsGenericType); 

MSDN link只是指出「獲取指示當前類型是否爲泛型類型。值」,但它沒有說明是什麼泛型類型意味着

不泛型類型意味着它從Object class繼承?

通用類型是否與抽象類有關?

什麼是.NET泛型類型的定義 - 我怎麼能確定它是否是一個泛型類型或沒有,從邏輯我自己(爲了理解這個概念)

+3

我建議你從https://msdn.microsoft.com/en-us/library/512aeb7t.aspx開始 –

+1

從Object派生的所有.net類型。作爲其他參考類型的泛型類型可以是或不可以根據程序員決定抽象 – Ivan

+0

感謝Jon Skeet,我正在研究它。謝謝伊凡 - 在這方面抽象是無關緊要的? –

回答

1

這裏

https://en.wikipedia.org/wiki/Generic_programming

文檔公共描述先回答你的兩個問題:

  1. 在.NET中所有類型,泛型類型和其他人Object派生。
  2. 泛型類型可能與任何其他類型一樣是抽象的,但它不需要。如果你創建一個抽象泛型類型,你需要從它派生一個非抽象類型,以便能夠從中實例化一個對象。

要確定類型是否是泛型,只需查看類定義即可。 Queue不是通用類型,而Queue<T>是通用類型,因爲通過用其他類型替換通用類型參數T可以獲得不同的類型。例如Queue<int>,Queue<string>,Queue<Object>等全部使用與Queue<T>類中定義的代碼相同的代碼。注意它們本身也是泛型類型。嵌套在泛型中的嵌套類型也被認爲是泛型類型。 「基本類型」Queue<T>被稱爲泛型類型定義

public abstract class MyListBase { } 
public abstract class MyListBase<T> : MyListBase { } 
public class MyList<T> : MyListBase<T> 
{ 
    public class Nested { } 
} 
public class MyStringList : MyList<string> { } 

...

var isGenericType0 = typeof(MyListBase).IsGenericType; //False 
var isGenericType1 = typeof(MyListBase<>).IsGenericType; //True 
var isGenericType2 = typeof(MyListBase<>) 
    .MakeGenericType(typeof(char)).IsGenericType; //True 
var myIntegerList = new MyList<int>(); 
var isGenericType3 = myIntegerList.GetType().IsGenericType; //True 
var myNested1 = new MyList<int>.Nested(); 
var isGenericType4 = myNested1.GetType().IsGenericType; //True 
var myStringList = new MyStringList(); 
var isGenericType5 = myStringList.GetType().IsGenericType; //False 

希望你可以用你的頭周圍泛型類型現在。

0

泛型讓您量身定製的方法,類,結構或接口來執行它所執行的精確數據類型。

泛型類型定義是用作模板的類,結構或接口聲明,其中包含可以包含或使用的類型的佔位符。例如,System.Collections.Generic.Dictionary類可以包含兩種類型:鍵和值。因爲泛型類型定義只是一個模板,所以不能創建一個泛型類型定義的類,結構或接口的實例。

public class Generic<T> 
{ 
    public T Field; 
} 
0

很難描述什麼是.NET中的通用答案。閱讀文檔更好。

簡而言之,它是С++中的模板,Java,.NET,Delphi中的泛型。從MSDN

+0

感謝伊萬,我寫了代碼與「類型」爲了使用泛型,但我試圖找出「.isGenericType」方法看什麼。例如我必須解釋爲什麼我在比較方法中將「isGenericType」用於評論中的其他人。 –

+0

在運行時CLR將泛型類型編譯爲具體類型,它的名稱爲「〜1」。您可以在變量上看到這樣的類型名稱,例如,類型列表。在Visual Studio中設置斷點並找出類型名稱。在此編譯的即時虛擬IsGenericType被重寫爲返回true – Ivan