• 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变量

  • 相关阅读:
    JS原型链与instanceof底层原理
    流程关系图制作---ProcessOn从入门到精通
    VBA比较两个Excel数据的异同
    C# 通过 Quartz .NET 实现 schedule job 的处理
    C# 通过 Quartz .NET 实现Timer Job并将其注册成为Windows Service
    在.Net Framework中调用Python的脚本方法 (以VB和C#为例)
    用Python建立连接直接读取与更改Rockwell Control Logix Controller的tag值
    C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)
    如何根据条件来确定某个字段是否应该被序列化
    在Asp.Net MVC 中如何用JS访问Web.Config中appSettings的值
  • 原文地址:https://www.cnblogs.com/qionghua/p/2615662.html
Copyright © 2020-2023  润新知