从VB转来C#,很多概念性的东西理解不够深刻,请教一下各位大虾们,看我的理解是否有误:
1:泛型中List<T> 和 Dictionary<K,V>其实相当于VB中的Collection(支持类的集合)。
2:泛型类有什么用?什么时候能用得到?PS:看到这里的时候糊里糊涂的。
1:泛型中List<T> 和 Dictionary<K,V>其实相当于VB中的Collection(支持类的集合)。
2:泛型类有什么用?什么时候能用得到?PS:看到这里的时候糊里糊涂的。
跟arrylist 有点像, 但是避免了装箱, 拆箱 的问题, !
泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
具有泛型机制的软件开发平台及语言
.Net 平台 2.0及以上版本
JAVA 5及以上版本
例如:通常一个方法或过程的签名都是有明确的数据类型的。
如 :
public void ProcessData(int i){}
public void ProcessData(string i){}
public void ProcessData(decimal i){}
public void ProcessData(double i){}
等。
这些方法的签名中的:int ,string,decimal,double 都是明确的数据类型,程序员访问这些方法的过程中需要提供指定类型的参数:
ProcessData(123);
ProcessData("abc");
ProcessData("12.12")
而如果我们将int ,string,decimal,double这些类型也当成一种参数传给方法的时候方法的定义便是这样:
public void ProcessData<T>(T i){} //T是int ,string,decimal,double这些数据类型的指代
用户在调用的时候便成了这样:
ProcessData<string>("abc");
ProcessData<int>(123);
ProcessData<double>(12.23);
这与通常的那些定义的最大区别是,方法的定义实现过程只有一个。但是它具有处理不同的数据类型数据的能力。
C# 2.0中有如List<>等泛型对象都具有此特性。
泛型的好处:
泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。它允许程序员将一个实际的数据类型的规约延迟至泛型的实例被创建时才确定。泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参的类型之一。下面的代码阐释一个简单的泛型类定义。
Visual Basic 代码
Public Class Generic(Of T)
Public Field As T
End Class
C# 代码
public class Generic<T>
{
public T Field;
}
C++ 代码
generic<typename T> public ref class Generic
{
public:
T Field;
};
在创建泛型类的实例时,会指定实际类型来替换类型参数。这会建立一个新的泛型类,称为构造泛型类,选定的类型将替换所有出现的类型参数。最后得到按照您选择的类型定制的类型安全的类,如下面的代码所示。
Visual Basic 代码
Dim g As New Generic(Of String)
g.Field = "A string"
C# 代码
Generic<string> g = new Generic<string>();
g.Field = "A string";
C++ 代码
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";
下面的术语用于讨论 .NET Framework 中的泛型:
“泛型类型定义”是用作模板的类、结构或接口声明,其中具有该类、结构或接口声明可以包含或使用的类型的占位符。例如,Dictionary 类可以包含两种类型:键和值。因为它只是一个模板,您不能创建作为泛型类型定义的类、结构或接口的实例。
“泛型类型参数”或称“类型参数”是泛型类型或方法定义中的占位符。Dictionary 泛型类型具有两个类型参数:TKey 和 TValue,分别表示其键和值的类型。
“构造泛型类型”或称“构造类型”是为泛型类型定义的泛型类型参数指定类型得到的结果。
“泛型类型参数”是替换泛型类型参数的任何类型。
一般术语“泛型类型”包括构造类型和泛型类型定义。
“约束”是加在泛型类型参数上的限制。例如,可以将类型参数限制为实现 IComparer 泛型接口的类型以确保可以对该类型的实例进行排序。还可以将类型参数限制为具有特定基类的类型、具有默认构造函数的类型或是引用类型或值类型。泛型类型的用户不能替换不满足这些约束的类型参数。
“泛型方法定义”是具有两个参数列表的方法:一个泛型类型参数列表和一个形参列表。类型参数可以作为返回类型或形参的类型出现,如下面的代码所示。
Visual Basic 代码
Function Generic(Of T)(ByVal arg As T) As T
Dim temp As T = arg
...
End Function
C# 代码
T Generic<T>(T arg) { T temp = arg; ...}
C++ 代码
generic<typename T> T Generic(T arg) { T temp = arg; ...};
泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法 G 是泛型方法。
Visual Basic 代码
Class A
Function G(Of T)(ByVal arg As T) As T
...
End Function
End Class
Class Generic(Of T)
Function M(ByVal arg As T) As T
...
End Function
End Class
C# 代码
class A
{
T G<T>(T arg) {...}
}
class Generic<T>
{
T M(T arg) {...}
}
C++ 代码
ref class A
{
generic<T> T G(T arg) {...};
};
generic<typename T> ref class Generic
{
T M(T arg) {...};
};
Visual C++、C# 和 Visual Basic 都提供了对定义和使用泛型的完全支持。有关更多信息,请参见 Visual Basic 中的泛型类型、泛型介绍(C# 编程指南)和 Overview of Generics in C++。
嵌套类型和泛型
嵌套于泛型类型中的类型依赖于封闭泛型类型的类型参数,公共语言运行库将这样的嵌套类型视为泛型,即使它们没有自己的泛型类型参数。在创建嵌套类型的实例时,需要为所有封闭泛型类型指定类型参数。
可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法
更多请参考MSDN
MSDN官方标准定义
比如对一类有同一功能的东东时,用泛型即可减轻很大的工作量。