java中泛型,.NET 中的泛型

泛型是 .NET 2.0 中引入的一个新特性,从 .NET 2.0 发布到现在已经过去好多年的时间了,到现在很多公司在面试时都喜欢问诸如用过泛型吗、什么是泛型、怎么写泛型之类的问题。似乎泛型是什么高深莫测的绝学了,犹如辟邪剑法一样,一般人难以运用。其实虽然每个 .NET 程序员的具体工作内容不一样,但是对于 .NET 里的一些基本的东西的运用相差不会很大,我想对于学过C# 的刚毕业的学生也不至于没有用过泛型。下面我就简单说一下泛型。
泛型将类型参数的概念引入了 .NET 中,类型参数使类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。
泛型类型参数
在泛型类或方法的定义中,类型参数是客户端代码在实例化泛型类型的变量时指定的特定类型的占位符。通常我们使用 T 作为类型参数占位符,但这并不是必须的,我们可以使用一些更有意义的描述性的名称作为类型占位符,如 TInput、TOutput 等。
public class List
类型参数的约束
在定义泛型类型时可以对客户端代码在实例化类时用于类型参数的类型加以限制。如果客户端使用违反约束的类型来实例化类型,则会产生编译时错误。约束使用 where 关键字指定。
结束 说明
where T: struct 类型参数必须是值类型
where T: class 类型参数必须是引用类型
where T: new() 类型参数必须有一个 public 且无参数的构造函数
where T: 类型参数必须继承至指定的基类(base class)
where T: 类型参数必须是指定的接口或实现了指定接口的类型
where T: U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数
public class Student { public Student(string name, int age) { Name = name; Age = age; } public string Name { get; set; } public int Age { get; set; } } public class Teacher where T : new() { public string Name { get; set; } public int Age { get; set; } public string Course { get; set; } }
上面的代码中我们定义了一个 Student 类和一个 Teacher 类,其中 Student 类只有一个带两个参数的构造函数。Teacher 类是一个泛型类,它的类型参数必须有一个无参的构造函数,如果使用 Student 类去实例化 Teacher 类编辑器会给出错误提示。
[TestMethod] public void TestMethod1() { List names = new List(); names.Add("Bruce"); names.Add("Alfred"); names.Add("Tim"); names.Add("Richard"); names.ForEach(Print); } private void Print(string s) { Console.WriteLine(s); }
使用泛型类型参数时,有一个问题就是由于我们并不知道这个参数是值类型还是引用类型,因此无法设置它的默认值。解决方法是使用 default 关键字,default 关键字对于引用类型会返回null,对于数值类型会返回0,对于结构会返回初始化为0或null的结构成员。
参考:http://msdn.microsoft.com/en-us/library/512aeb7t(v=VS.100)
Tags:  泛型类 泛型编程 java泛型 java中的泛型 java中泛型

延伸阅读

最新评论

发表评论