C#泛型概述
来源:互联网 发布:手机电缆报价软件 编辑:程序博客网 时间:2024/05/17 02:47
泛型允许创建“类型参数”的代码,即:泛型代码在声明的时候并不特定于具体的数据类型,而是使用的时候才去制定数据类型。
泛型参数可以是值类型或者应用类型。
C#提供了泛型类、泛型接口、泛型结构、泛型委托和泛型方法这几种类型。
.NET Framework类库中提供了大量基于泛型实现的类,System.Collections.Generic命名空间中的List<T>类似最常见的一种。以下为用List<T>创建一个整形数组。
List<int> list = new List<int>();list.Add(1);//不需要装箱list.Add(2);int num1=list[0];//list 包含的元素都是int类型,故不需要类型转换
对ArrayList类型的集合来说,它的元素类型为object,也就是说可以向集合中添加任意类型的数据:
ArrayList list=new ArrayList();list.Add(1);list.Add("hello");list.Add(DateTime.Now);
由此可见它不可能成为一种类型安全的集合,但是泛型则可以,因为在创建时我们就必须指定类型T为什么。
泛型类
与普通类一样,泛型类也支持继承,它可以继承自具体的类,或者实现泛型接口,而且还可以指定基类的类型参数来定义基于特定类型的子类。
如下我们可能需要一个键的类型为int的字典类:
class MyDictionary<TVuale> : Dictionary<int, TVuale> { } class Program { static void Main(string[] args) { MyDictionary<string> myDict = new MyDictionary<string>(); myDict.Add(1, "hello"); Console.WriteLine(myDict[1]); Console.ReadLine(); //myDict.Add("key","value")//编译失败 } }
泛型类的静态变量只能被类型参数相同的类说共享。如:
class SimpleGeneric<T>//此处为泛型类的声明 { public SimpleGeneric(T value) { Value=value; } public T Value { get; private set;} public static int n; } class Program { static void Main(string[] args) { SimpleGeneric<int>.n = 4; SimpleGeneric<string>.n = 6; Console.WriteLine(SimpleGeneric<int>.n); Console.WriteLine(SimpleGeneric<string>.n); Console.ReadLine(); } }
由此可见,SimpleGeneric<int>与 SimpleGeneric<string>作为 SimpleGeneric<T>类的具体实现,它们是两个不同的类,故不会共享静态成员、
泛型方法
.NET的泛型允许在泛型类,非泛型类、结构和接口中定义泛型方法。同泛型类一样,泛型方法在声明时也拥有一个类型参数。
泛型方法的声明形式如下:
class Program { static void Main(string[] args) { int n = 6; DateTime date = DateTime.Now; SetToDefault(ref n); SetToDefault(ref date); Console.WriteLine(n); Console.WriteLine(date); Console.ReadLine(); } static void SetToDefault<T>(ref T value) { value = default(T); } }
注意调用SetToDefault<T>这个泛型方法时并没有指定类型参数,这是因为编译器能够自动推断参数的类型。
以下写法是错误的:
class MyMath{ public T test<T>(T value) { return value + value; }}
C#中不能再泛型方法中对泛型参数使用加、减等运算符,因为C#泛型没有运算符约束。但是我们可以创建泛型接口,并实现接口来解决这类问题,因为接口中并没有提供方法的实现。
如:
interface IMath<T>{ T Add(T value1,T value2);}class MyMath:IMath<T>{ public T test<T>(T value) { return value + value; }}
- C#泛型概述
- C#泛型概述
- C#泛型(一)——泛型概述
- c#概述
- C#概述
- C#概述
- C# 概述
- C#概述
- C#概述
- C#概述
- C#概述
- C#概述
- c#概述
- C#概述
- C# 泛型编程之概述、default()方法、别名指定与泛型约束
- C#网络编程概述
- C#网络编程概述
- C#语言概述
- 黑马程序员—面向对象特征之一多态
- 详解Objective-c Block应用
- 【网络命令】Ping 详解
- 包安装失败 ! 无法修改密码,启动报错 ubuntu 12.10 下安装 mysql-5.5.28-linux2.6-x86_64 包,最终回到终端在线安装
- 《代码大全》学习笔记(4):建立子程序的步骤
- C#泛型概述
- c语言小试
- HDU2112 HDU Today(最短路径)
- Android的layout_weight属性详解
- 虚拟机上用QT designer 输入不了文字,鼠标正常
- Ping命令和网络端口
- pthread on ubuntu 12.04
- Ping端口方法
- 在程序里判断编译的是debug还是release版本