C# -- 泛型(2)[转载]

通过前面的文章我们知道“泛型”是个“形容词”,并且了解了 “泛型类” 和 “泛型数组” ,下面我们来看看泛型的其它的使用方式。

出自: Keiling_J'Blog http://www.cnblogs.com/keiling/

<1>.泛型方法

上一篇文章说到用一个泛型类 SortHelper 来做一个冒泡排序的处理,下面回顾一下之前的代码:

 

复制代码
    public class SortHelper<T> where T:IComparable
    {
        public void BubbleSort(T[] arr)
        {
            int length = arr.Length;
            for (int i = 0; i < length-1; i++)
            {
                for (int j = 0; j < length-1-i; j++)
                {
                    if (arr[j].CompareTo(arr[j+1])>0)
                    {
                        T temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
        }
    }
复制代码

 

 

 

这里我们为了调用 BubbleSort,而将参数T传递给类 SortHelper,假如 SortHelper 类中,除了 BubbleSort 方法之外,还有其他的没有使用到参数T的方法 比如:

 

复制代码
    public class SortHelper<T> where T:IComparable
    {
        public void BubbleSort(T[] arr)
        {
                //省略
        }
        
        public void OtherMethod1()
        {
                //省略
        }
        //此处省略N个OtherMethod
    }
复制代码

 

这里有 N 个 OtherMethod方法。

测试-调用 OtherMethod1

        static void Main(string[] args)
        {
            SortHelper<int> UserOtherMethod = new SortHelper<int>();
            UserOtherMethod.OtherMethod1();
        }

在实例化 UserOtherMethod 对象时 必须给 SortHelper 传一个类型参数 这里是 int  。显然这中情况下,我们仅仅是为了 BubbleSort 方法正常使用而定义泛型类,从而强迫其他使用 SortHelper 类其它方法

的实例传递一个参数,很明显这是没必要的,于是这个时候 ’泛型方法‘ 就出现了 ,修改代码如下:

复制代码
    public class SortHelper2
    {
        public void BubbleSort<T>(T[] arr) where T:IComparable
        {
            int length = arr.Length;
            for (int i = 0; i < length - 1; i++)
            {
                for (int j = 0; j < length - 1 - i; j++)
                {
                    if (arr[j].CompareTo(arr[j + 1]) > 0)
                    {
                        T temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
        }
    }
复制代码

 

总结:

泛型方法和普通方法没多大区别,仅仅在方法名后面加了“<T>”, 接着是括号里面的参数,最后是限定语句。

上述的这种情况,我们通过使用泛型方法,就可以避免每次使用泛型类传参了。

 

 

<2>.泛型接口

回顾之前的文章我们 自己写了一个 “cat” 类,并调用了一个接口“IComparable” 代码如下:

复制代码
    public class cat:IComparable
    {
        public string name;
        public int price;

        public int CompareTo(object obj)
     {       cat catT = (cat)obj;
      return this.price.CompareTo(catT.price);
     }      public cat(string name, int price)
        {
            this.price = price;
            this.name = name;
        }
    }
复制代码

 

这里粉红色标记的部分我们实现了 “IComparable” 接口的 “CompareTo” 方法 这里没有进行装箱和拆箱。

因为cat是引用类型,而且 return this.price.CompareTo(catT.price)这里调用的是 price (int型) 的 ComparaTo 方法,右键对int转到定义查看代码。

这里可以清楚的看到int类型实现了 IComparable IComparable<int> 这两个接口,也就是说它分别实现了这两个接口的 ComparaTo() 方法,那这里又是调用那个接口的 ComparaTo() 方法呢?

实际上这里传过来的参数是int类型,那么优先调用的是 ComparaTo(int value) 方法,这样就避免了不必要的装箱拆箱过程了。

上图中是.NETint 类型实现 IComparable 接口的 ComparaTo(object value) 方法,不难看出“红箭头”标记部分是执行装箱拆箱操作的过程。

下图int类型实现泛型版本的 IComparable<int> 的 ComparaTo(int value) 方法,如果对2种方法进行大量重复操作,不难发现使用泛型接口实现的方法性能比较好

总结:

程序设计中应该尽量避免装箱和拆箱操作,为了避免多次装箱拆箱造成的性能影响 ,通过上面的例子我们可以知道使用泛型接口可以有效的避免这个问题:使用 IComparable<T> 而不使用 IComparable,这样可以避免值类型的装箱和取消装箱操作。

 

出自: Keiling_J'Blog http://www.cnblogs.com/keiling/

posted @   醉马踏千秋  阅读(134)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示