• C#泛型


    为了避免编译时类型检查报错,导致相似功能需要写多段类似代码,我们会希望放松对类型的检查。

    泛型因运而生。

    泛型可以用在类上,也可以用在方法上。

    例 方法泛型:

    某类中有一方法,能够找出一组值中长度超过2的元素。对于字符串和数字等,我们不想写多个方法,就可以用泛型。

    类代码:

     1 class Test
     2     {
     3         public static void show<T>(IEnumerable<T> x)
     4         {
     5             foreach (var item in x)
     6             {
     7                 if(item.ToString().Length>2)
     8                 {
     9                     Console.WriteLine(item);
    10                 }
    11             }
    12         }
    13     }

    其中“T”表示泛型(可以是任意标识符)

    调用代码:

    static void Main(string[] args)
            {
                int[] c = { 3, 123, 5, 147, 9, 66, 789 };
                string[] t = { "zs", "wangermazi", "k", "lisi" };
                List<string> d = new List<string>(t);
                Test.show<int>(c);
                Test.show<string>(d);
            }

    运行效果:


     使用中,为了表示泛型中,可用类型的共性,能够获得代码提示等便利,我们会使用“泛型约束”。

    例 带约束的类泛型:

    人类都会打招呼,中国人外国人各有不同。假洋鬼子可以用两种语言打招呼。

    分析、实现如下:

    1、人类都会打招呼--使用抽象类,描述共性

    abstract class Person
        {
            public abstract void say_Hi();
        }

    2、中国人外国人各有不同--实现抽象类

    中国人:

    class Chi:Person
        {
            public override void say_Hi()
            {
                Console.WriteLine("你好!");
            }
        }

    外国人:

    class Ame:Person
        {
            public override void say_Hi()
            {
                Console.WriteLine("Hello!");
            }
        }

    3、假洋鬼子可以在两种方式间切换

    class JiaYangGuiZi<T> where T:Person,new()
        {
            public void dazhaohu()
            {
                new T().say_Hi();
            }
        }

    4、主程序:

    JiaYangGuiZi<Ame> a = new JiaYangGuiZi<Ame>();
                JiaYangGuiZi<Chi> b = new JiaYangGuiZi<Chi>();
                a.dazhaohu();
                b.dazhaohu();

    运行效果:

      关于泛型约束的具体内容,可以自行在微软官网查找资料。

    另:

    如果泛型放松的类型检查仍然不能满足你的要求,可以用“动态类型”彻底放弃编译时类型检查。

    (关于动态类型的知识,可以自行查找学习)

    此时如果有错,将在运行时发生。而且在编码过程中也无法使用智能提示。

  • 相关阅读:
    排序比较与总结
    Oracle误删恢复
    DSP TMS320C6000基础学习(4)—— cmd文件分析
    NYOJ 488 素数环
    Oracle常用语句记录
    Cocoa编程开发者手册
    Unity3d物体模型(实现旋转缩放平移自动旋转)
    django 创建一个通用视图
    ContentResolver + SqliteOpenHelper + ContentProvider 理解
    线性回归,logistic回归和一般回归
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/14862044.html
Copyright © 2020-2023  润新知