C# 基础系列泛型

  泛型从2.0版开始支持,他与程序集中IL(中间语言)代码紧密的集成。有了泛型,我们不必要给不同的类型编写功能相同的方法和类,仅仅创建一个方法或者类就可以。

  使用泛型还有一个目的,减少代码中使用object类,object类不是类型安全,而且使用发现避免了object类使用过程中的装箱和拆箱的过程,提高性能。

  泛型类的格式  class MyClass<T>{}

      泛型方法     T Function<T>()

  泛型接口    interface MyInterfac <T>

  可能有些朋友就说,为什么我们要用字母 T  呢,没有为什么,你想用B也可以,但是这个T是大家几乎约定俗成的。 多个泛型类型时候,我们约定俗成的头字母 Txx 

  


安全性。装箱拆箱

  为什么说,泛型可以提高安全性及装箱、拆箱的过程呢?来个简单的代码你们就知道了

  

var list = new  ArrayList();
list.Add(44); //装箱
list.Add("mystring");
list.Add(new  MyClass());

int i = (int)list[0]; //拆箱

  这个list的就是不安全的,如果我们要对他继续类型转换,那么他就会出现异常。而且他add int类型,string类型的时候就要涉及装箱,你取出来的时候要涉及的拆箱


默认值

  我们可以用default关键字为  泛型 设置默认值

public T GetT()
{
    return default(T);
}

  


约束

  在泛型中,如果我们希望对泛型的类型进行一些类型限制,那么我们就可以用关键字where进行限制

下表列出了六种类型的约束:

 

约束

说明

T:struct

类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关更多信息,请参见 使用可以为 null 的类型(C# 编程指南)

T:类

类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}

  这个是多类,接口,无参数的公共构造函数 各种进行了约束

  如果在泛型类中使用staitc 变量,他们如果对这个变量赋值,是不是都是公有一个static变量呢。实际上是不会的,不同的泛型类型都是用自己独立的static变量

原文地址:https://www.cnblogs.com/qionghua/p/2615662.html