2016-02-15 148 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