zoukankan      html  css  js  c++  java
  • 编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型

    建议32:总是优先考虑泛型

    泛型的优点是多方面的,无论泛型类还是泛型方法都同时具备可重用性、类型安全性和高效率等特性,这是非泛型和非泛型方法无法具备的。

    以可重用性为例:

        class MyList
        {
            private int[] items;
    
            public int this[int i]
            {
                get { return items[i]; }
                set { this.items[i] = value; }
            }
    
            public int Count
            {
                get { return items.Length; }
            }
            ///省略其他方法
        }

    该类型只支持整型,如果要让类型支持字符串,有一种方法是重新设计一个类。但是这两个类型的属性和方法都是非常接近的,如果有一种方法可用让类型接收一个通用的数据类型,这样代码就可以复用了,同时类型也只要一个就够了。泛型完成的就是这样一个功能。泛型实现如下:

        class MyList<T>
        {
            private T[] items;
    
            public T this[int i]
            {
                get { return items[i]; }
                set { this.items[i] = value; }
            }
    
            public int Count
            {
                get { return items.Length; }
            }
    
            ///省略其他方法
        }

    可以把T理解为一个占位符,在C#泛型编译生成的IL代码中,T就是一个占位符的角色。在运行时,即时编译器(JIT)会用实际代码中输入的T类型来代替T,也就是说,在由JIT生成的本地代码中,已经使用了实际的数据类型。我们可以吧MyList<T>和MyList<T>视作两个不同类型,但是,这仅是对本地代码而言,对应实际的C#代码,它仅仅拥有一个类型,那就是泛型类型MyList<T>。

    如果不用泛型来实现,另一种方法是让MyList的编码从object的角度去设计。在C#的世界中,所有类型(包括值类型和引用类型)都是继承自object,如果让MyList足够通用,就需要让MyList针对object编码,代码如下:

        class MyList
        {
            private object[] items;
    
            public object this[int i]
            {
                get { return items[i]; }
                set { this.items[i] = value; }
            }
    
            public int Count
            {
                get { return items.Length; }
            }
            ///省略其他方法
        }

    这会让下面的代码编译通过:

    list[0]=123;

    list[1]="123";

    由上面两行代码带来的问题就是非类型安全性。让类型支持类型安全,可以让程序在编译期间就过滤掉部分Bug,同时,也能让代码避免“转型为object类型”或“从object转型为实际类型”所带来的性能损耗。尤其是当操作类型是值类型时,还会带来装箱拆箱的性能损耗。

    泛型为C#语言带来了革命性的变化,FCL之后的很多功能都是借助泛型才得到很好的实现,如LINQ。LINQ借助于泛型和扩展方法,有效地丰富了集合的查询功能,同时避免了代码爆炸并提升了操作性能。我们在设计自己的类型时,应充分考虑到泛型的优点,让自己的类型成为泛型类。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    客户端通过spice-gtk实现USB重定向
    KVM通过qemu实现USB重定向
    Json
    《卓有成效的管理者》读书笔记
    《第五项修炼•实践篇》读书笔记
    《远大前程——从软件新手到行业大件》读书笔记
    目前常用的网站
    Objective-C内存管理
    Ubuntu修改屏幕默认亮度
    Ubuntu下安装eclipse及PyDev插件注意事项
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4731964.html
Copyright © 2011-2022 走看看