最近在入职一家新公司,新公司框架代码里许多用到泛型的地方,那就学习一下
一.泛型的概念
泛型是C#2.0推出的新语法
“泛型”的字面意思就是 广泛的类型。类、接口和方法代码可以同应用于非常广泛的类型,代码与它们可以操作的数据类型不再绑定在一起,同一套代码可以用于多种数据类型,这样,不仅可以服用代码,降低耦合,而且可以提高代码的可读性和安全性。
1.一个简单的demo
//user类 public class User { public string name; // 姓名 public int age; // 年龄 public User(string name, int age) { this.name = name; this.age = age; } }
User user1 = new User("李宁",21); User user2 = new User("耐克", 21); User user3 = new User("阿迪", 21); //声明Dictionary泛型变量 //key的类型为int,Value的类型为User Dictionary<int, User> users = new Dictionary<int, User>(); //向users添加"元素","元素"的key不能重复 users.Add(2,user1); users.Add(3, user2); users.Add(5, user3); foreach (var p in users) { Console.WriteLine(p.Key); Console.WriteLine(p.Value.name); Console.WriteLine(p.Value.age); } foreach (var u in users.Values) { Console.WriteLine(u.name); Console.WriteLine(u.age); }
这里利用字典类进行解释泛型的概念
二.泛型约束
在写程序的时候经常看到如下代码:
public class MyClass5<T> where T :IComparable { }
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。
下表列出了五种类型的约束:
约束 | 说明 |
---|---|
T:struct |
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。 |
T:class |
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() |
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> |
类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> |
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U |
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束. |
转载于:https://www.cnblogs.com/dotnet261010/p/9034594.html