C#学习笔记-泛型
2010-04-13 16:24
344 查看
泛型将类型参数的概念引入了.Net,当我们需要设计类和方法,并将它们的类型制定推迟到客户端代码声明,并实例化该类型和方法时,可以使用泛型。泛型使之前的想法成为了可能。使用泛型避免了运行时强制转换或装箱操作带来的风险。简单来说,首先制定一个特定符号代替实际类型,当创建该类型的实例时,才指定它的实际类型。
泛型可以让类、结构、委托、接口和方法通过他们所存储和操作的数据的类型被参数化。
为什么要使用泛型?我们以实例来说明:
在上面的代码中,使用的全部都是整型变量,在软件设计中,去求是经常变更的,如果我要求输入的是浮点型该怎么办呢?当然,我们可以把int改为object,并使用强制转换,如下面所示:
我们看到,上面的程序也能够编译通过并运行,但实际上这是非常消耗资源的,因此这种方法并不可用。而泛型就是为了解决这个问题而存在的,使用泛型很简单,看下面的代码:
在泛型实例化后,可以很方便的制定他的修饰符为double或string。
泛型的约束:
为了对客户端代码在实例化时对类型参数加以限制,可以使用泛型的约束,约束是使用where
关键字指定的,共有6种约束类型
泛型可以让类、结构、委托、接口和方法通过他们所存储和操作的数据的类型被参数化。
为什么要使用泛型?我们以实例来说明:
class Stack { private int[] items; private int count; public Stack(int size) { items = new int[size]; count = 0; } public void Push(int x) { items[count++] = x; } public int Pop() { return items[--count]; } } class Test { static void Main() { Stack s = new Stack(10); s.Push(111); s.Push(222); Console.WriteLine(s.Pop() + s.Pop()); Console.ReadKey(); } }
在上面的代码中,使用的全部都是整型变量,在软件设计中,去求是经常变更的,如果我要求输入的是浮点型该怎么办呢?当然,我们可以把int改为object,并使用强制转换,如下面所示:
class Stack { private object[] items; private int count; public Stack(int size) { items = new object[size]; count = 0; } public void Push(object x) { items[count++] = x; } public object Pop() { return items[--count]; } } class Test { static void Main() { Stack s = new Stack(10); s.Push(111.1); s.Push(222.2); Console.WriteLine((double)s.Pop() + (double)s.Pop()); Console.ReadKey(); } }
我们看到,上面的程序也能够编译通过并运行,但实际上这是非常消耗资源的,因此这种方法并不可用。而泛型就是为了解决这个问题而存在的,使用泛型很简单,看下面的代码:
class Stack<T>// 使用泛型 { private T[] items; private int count; public Stack(int size) { items = new T[size]; count = 0; } public void Push(T x) { items[count++] = x; } public T Pop() { return items[--count]; } } class Test { static void Main() { // 实例化泛型,使用浮点型 Stack<double> s = new Stack<double>(10); s.Push(111.1); s.Push(222.2); Console.WriteLine(s.Pop() + s.Pop()); //实例化泛型,使用字符串 Stack<string> s1 = new Stack<string>(10); s1.Push("111.1"); s1.Push("222.2"); Console.WriteLine(s1.Pop() + s1.Pop()); Console.ReadKey(); } }
在泛型实例化后,可以很方便的制定他的修饰符为double或string。
泛型的约束:
为了对客户端代码在实例化时对类型参数加以限制,可以使用泛型的约束,约束是使用where
关键字指定的,共有6种约束类型
约束 | 说明 |
---|---|
T:结构 | 类型参数必须是值类型 。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南) 。 |
T:类 | 类型参数必须是引用 类型;这一点也适用于任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。 |
相关文章推荐
- c#学习笔记之泛型
- C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- C#回顾学习笔记三十五:泛型集合List
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
- C#学习笔记-接口,集合与泛型
- (转载)C#中泛型学习笔记
- [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
- C#学习笔记之泛型委托
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
- C# in Depth Third Edition 学习笔记-- C#2.0: 解决C#1.0的问题 1 泛型
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- 精通C#:Chapter9 集合与泛型-学习笔记
- [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
- [C#]C#学习笔记-接口,集合与泛型
- C#中泛型学习笔记
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- C# 泛型(学习笔记)
- C#学习笔记-泛型
- c# 泛型 - 学习笔记