• C#高级编程三十天----泛型结构,泛型方法,泛型托付


    泛型结构

    泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与编程语言中的数字的差别(数据库中数字能够为空,编程语言中数字不可为空).由于Nullable<T>使用过于的繁琐,于是就引入了一种特殊的语法,使用个”?”运算符.:

    int? x1;

    Nullable<int> x2;

    x1x2这两种方式定义是等价的.

    非空类型能够转化为可空类型. (总是成功的且能够隐式转化).

    可空类型能够转化为非空类型可空类型的值为null时就会抛出异常.(须要显示转化)

    假设不进行显示转化,我们就能够使用”??”运算符.案例:

    int? x1=GetNullableType();

    int y1=x1?

    ?

    0;

    这样一来,x1null,就会赋给y1一个0.

    泛型方法

    首先来看声明一个泛型方法的案例:

    //声明一个泛型方法

            public T getValue<T>(T t)

            {

                return t;

            }

     //调用泛型方法.注意:在调用泛型方法时,对反省方法的參数实例化

            public int userMethod()

            {

                return this.getValue<int>(10);

            }

            //重载getValue方法

            public int getValue(int i)

            {

                return i;

            }

    在调用的时候:int res=getValue<int>(3);

    泛型推理:在调用泛型方法时。C#编译器足够聪明。基于传入的參数类型来判断出正确的类型。而且它同意全然省略类型规范,例如以下所看到的:

    int res=getValue(3);

    泛型方法中反省參数的约束:

       public class Myclass

        {

            public void MyMethod<T>(T t) where T : IComparable<T>

            {

                //action

            }

    }

    无法为类级别的泛型參数提供方法级别的约束。

    案例:

     public class Myclass<T>

        {

            public void MyMethod<X>(X x, T t)

                where T : IComparable<T>

                where X : IComparable<X>

            {

                //action

            }

    }

    正确的做法是:

     public class Myclass<T>

        {

            public void MyMethod<X>(X x, T t)            

                where X : IComparable<X>

            {

                //action

            }

    }

    泛型參数虚方法的重写:子类方法必须又一次定义该方法特定的泛型參数,代码例如以下:

     public class BaseClass

        {

            public virtual void Method<T>(T t)

            {

            }

        }

        public class Myclass:BaseClass

        {

            public override void Method<T>(T t)

            {

                

            }

    }

    同一时候子类中的泛型方法不能反复基类泛型方法的约束。案例:

    public class BaseClass

        {

            public virtual void Method<T>(T t) where T : new()

            {

            }

        }

        public class Myclass : BaseClass

        {

            //正确写法

            public override void Method<T>(T t)

            {

            }

            //错误写法

            //public override void Method<T>(T t)where T:new()

            //{

            //}

    }

    子类方法调用虚拟方法的基类实现:它必须指定要取代泛型基础方法类型所使用的类型实參。你能够自己显式的指定它。也能够依靠类型推理(假设可能的话)代码例如以下:

     public class BaseClass

        {

            public virtual void Method<T>(T t) where T : new()

            {

            }

        }

        public class Myclass : BaseClass

        {

            public override void Method<T>(T t)where T:new ()

            {

                base.Method<T>(t);

                base.Method(t);

            }

    }

    泛型托付

    泛型托付相同在定义时声明泛型类型(<T>)

    托付封装的方法同一时候须要声明泛型类型.由于该方法的签名必须与托付的定义一致.

    public delegate void GenDelegate<T>(T input);

    GenDelegate<T> gd = DoWork;

    private static void DoWork<T>(T input)

    {

         //do what you what

    }

    实例中定义了泛型托付GenDelegate。该托付封装的方法接受一个參数。不返回不论什么值,參数类型由泛型类型T指定。

    总结一下,事实上非常easy,大不了就是给普通的类,方法。托付添加泛型类型的声明就变成了泛型类,泛型方法及泛型托付。

    这样一来,泛型类型就能够用于类里面的成员,能够用于方法的參数,能够用于托付封装的方法。

  • 相关阅读:
    IntelliJ IDEA 14.x 快捷键/个性化设置
    Memcache的mutex设计模式 -- 高并发解决方案
    导出/导入Eclipse的workspace配置(备份Eclipse配置)
    URL、URN、URI的区别?
    Thinkpad E440个性化设置:如何/禁用关闭触摸板?
    PHP 正则表达式匹配函数 preg_match 与 preg_match_all
    PHP合并2个数字键数组的值
    编译安装 Zend Opcache 缓存Opcache,加速 PHP
    Linux 新建用户、用户组,给用户分配权限(chown、useradd、groupadd、userdel、usermod、passwd、groupdel)
    alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5143202.html
Copyright © 2020-2023  润新知