绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
c#科普:再谈泛型?
2019-10-25 10:40:17

先看概念什么是泛型?

1、泛型是.net Framwork 2.0增加的新功能,注意泛型不是语法糖。

var i =10;

上面这句才是语法糖,编译器提供的便捷功能称之为语法糖

2、主要作用为了一个方法满足不同的类型的需求比如:一个方法完成多个实体查询,一个方法完成不同类型的数据展示,任意一个实体转换成一个json字符串,类型这些事情泛型很擅长,并且运行效率也非常高。

在没有引入泛型之前,我们先看看一个把数据添加到集合的方法。

添加int数值型:

public void Add(List list,int a)

{

list.Add(a);

}

添加字符串:

public void Add(List list,string a)

{

list.Add(a);

}

是不是要写两个方法?如果类似方法很多时候,就需要增加很多冗余代码,在没有引入泛型之前,那么可以写成一个合并方法

public void Add(List

{

list.Add(a);

}

但是这个有一个问题,Object会出现装箱和拆箱,会损耗程序的性能,作为一个有追求的程序猿,我们是尽量避免的。

如果用泛型就可以写成:

public void Add(List list, T a)

{

list.Add(a);

}

泛型不会出现装箱和拆箱的问题。

CLR内建了一些优化措施。假如为一个特定的类型实参调用一个方法,以后再次使用相同的类型实参来调用这个方法。CLR只会为这个方法/类型组合编译一次代码,如果一个程序集使用Add<DateTime>, 一个完全不同的程序集(加载到一个AppDomain中)也使用Add<DateTime>, CLR只会为Add<DateTime>编译一次方法。

那么有哪些泛型呢?

泛型方法:为了一个方法满足不同的类型的需求

泛型类:一个类满足不同类型的需求 List Dictionary

泛型接口:一个接口满足不同类型的需求

泛型委托:一个委托满足不同类型的需求

3.泛型种类:泛型类、泛型方法、泛型接口、泛型委托。

4.泛型原理是----泛型为什么也可以支持不同类型的参数?

泛型声明方法时,并没有写死类型,T是什么?不知道 T要等着调用 的时候才指定

设计思想:延迟声明,推迟一切可以推迟的,一切能晚点做的事 ,就晚点做

泛型方法和性能跟普通方法一致,是好和速度快的的,而且还能一个方法满足多个不同类型,减少了代码量。

注意::::::

WebServices WCF 都不能用泛型,为什么?

/跨语言的,别的语言也不能用,不支持泛型。

服务在发布的时候必须是确定的,泛型在编译时确定 不了

5.声明泛型 方法名称后加上尖括号,里面是类型参数

类型参数实际上就是一个类型声明,方法就是可以用这个类型T了。

下面为演示

public class GenericTest

{

///

/// 多个类型参数 不能关键字作为参数 类型名称不能重复

///

///

///

public T Get(T tParameter)

{

throw new Exception();

}

}

///

/// 泛型继承要指定父类类型

///

public class ChildClass:GenericClass,GenericInterface

{

}

///

/// 泛型类子类

///

///

public class GenericChildClass : GenericClass

{

}

///

/// 泛型类

///

///

public class GenericClass

{

}

///

/// 泛型接口

///

///

public interface GenericInterface

{

}

///

/// 泛型委托

///

///

public delegate void Do

list, object a)

分享好友

分享这个小栈给你的朋友们,一起进步吧。

应用开发
创建时间:2020-06-17 15:31:04
应用软件开发是指使用程序语言C#、java、 c++、vb等语言编写,主要是用于商业、生活应用的软件的开发。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~