c# 中的泛型以及强类型与弱类型
2015-05-04 15:40
162 查看
一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时其类型便是明确的:String便是String,Int32就是Int32。强类型的语言有以下几点好处:
1.能够享受代码提示功能
2.能够获得重构工具的支持
3.能够在编译期发现更多错误
与强类型相对的就是弱类型了,下面先简单介绍一下强类型与弱类型,接着再说明一下为何引入泛型以及泛型的好处。
不管是哪一种编程语言,其中使用的变量,都既有类型,又有值。强类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,弱类型的变量类型则是无需声明的,由解释器解释。但是,这并不意味着,弱类型的变量就没有类型这一概念了,举例来说,PHP的GetType就是返回该变量“当前”的类型。
2)强类型的变量类型是不能改变的,弱类型变量是随需改变的,这是强弱的真正含义
强类型的变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能付给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换。但是,弱类型的变量类型则是随着需要不断转换
简单点说,强类型的变量的类型是在编译阶段就确定了,而弱类型的变量的类型是在运行的时候才确定的。最典型的就是var关键字。
(1)C#
在C#语言中,第一句的变量声明以及赋值就已经指明Name是string类型的变量了,以后再想修改Name的类型就会报错。
(2)js
js是一种动态语言,变量的真正类型需要在运行的时候才能具体确定,所以上面的Name的值为布尔值:true
没有泛型的时候,所有的对象都是以object为基础(object是所有对象的基类),如果要使用时必须进行强制类型转换。对于值类型的转换,则会导致不断拆箱、装箱的过程,会造成系统不停地分配内存、垃圾回收、资源回收,对系统消耗很大。
这个时候该泛型上场了
(1)使用泛型时不需要通过object类进行强制类型转换以及装箱、拆箱。
(3)泛型最早是用于集合中的,如List<>、Directory<Tkey,Tvalue>。泛型不仅仅可用于集合,还可以用于委托、接口和方法。
泛型类
泛型接口
泛型方法
泛型委托
使用泛型有效的减少了数据类型转换以及由此产生的装箱、拆箱,同时也减少了垃圾回收的次数,使程序具有较高的性能。
2.类型安全
上面的代码不能有效避免异常的出现。而下面的代码在编译阶段就可以有效避免可能出现的异常:直接编译不通过
3.代码的重用、多态
List<T>这个泛型类在使用时可以根据需要用不同的类型实例化
上面只是简单地介绍了一下泛型 的知识,泛型的具体使用会在下面的文章给出。
1.能够享受代码提示功能
2.能够获得重构工具的支持
3.能够在编译期发现更多错误
与强类型相对的就是弱类型了,下面先简单介绍一下强类型与弱类型,接着再说明一下为何引入泛型以及泛型的好处。
一、强类型与弱类型
1)不管是强类型还是弱类型,变量都有两个属性:类型和值;也就是说,弱类型的变量同样有类型。不管是哪一种编程语言,其中使用的变量,都既有类型,又有值。强类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,弱类型的变量类型则是无需声明的,由解释器解释。但是,这并不意味着,弱类型的变量就没有类型这一概念了,举例来说,PHP的GetType就是返回该变量“当前”的类型。
2)强类型的变量类型是不能改变的,弱类型变量是随需改变的,这是强弱的真正含义
强类型的变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能付给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换。但是,弱类型的变量类型则是随着需要不断转换
简单点说,强类型的变量的类型是在编译阶段就确定了,而弱类型的变量的类型是在运行的时候才确定的。最典型的就是var关键字。
(1)C#
var Name = "Bill Gates"; Name = 123;
在C#语言中,第一句的变量声明以及赋值就已经指明Name是string类型的变量了,以后再想修改Name的类型就会报错。
(2)js
var Name = "Bill Gates"; Name = 123;
Name = true;
js是一种动态语言,变量的真正类型需要在运行的时候才能具体确定,所以上面的Name的值为布尔值:true
没有泛型的时候,所有的对象都是以object为基础(object是所有对象的基类),如果要使用时必须进行强制类型转换。对于值类型的转换,则会导致不断拆箱、装箱的过程,会造成系统不停地分配内存、垃圾回收、资源回收,对系统消耗很大。
ArrayList list1 = new ArrayList(); list1.Add(1); //装箱 int il1 = (int)list1[0];//拆箱 foreach (var item in list1) { } Console.WriteLine(i2); //执行拆箱
这个时候该泛型上场了
二、泛型的概念
泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。(1)使用泛型时不需要通过object类进行强制类型转换以及装箱、拆箱。
List<int> list2 = new List<int>(); list2.Add(44); //不执行装箱 int il2 = list2[0];//不执行拆箱 foreach (int i2 in list2) Console.WriteLine(i2); //不执行拆箱
(3)泛型最早是用于集合中的,如List<>、Directory<Tkey,Tvalue>。泛型不仅仅可用于集合,还可以用于委托、接口和方法。
泛型类
public class Person<T> where T:class { public string name { get; set; } public char sex { get; set; } public Person() { } public Person(string name, char sex) { this.name = name; } }
泛型接口
public interface IComparable<T> where T:class { T Max(T msg); void Say(T msg); }
泛型方法
public void Poligise<T>(T msg) { Console.WriteLine(msg); }
泛型委托
public delegate void MDelegate<T>(T msg);系统内有一些自带的委托,如果没什么特殊的要求,我们最好还是采用系统泛型。如Action、Func泛型
三、泛型的优点:
1.高性能使用泛型有效的减少了数据类型转换以及由此产生的装箱、拆箱,同时也减少了垃圾回收的次数,使程序具有较高的性能。
2.类型安全
ArrayList list = new ArrayList(); list.Add(44); list.Add("mystring"); list.Add(new MyClass()); foreach (int i in list) Console.WriteLine(i);
上面的代码不能有效避免异常的出现。而下面的代码在编译阶段就可以有效避免可能出现的异常:直接编译不通过
List<int> list2 = new List<int>(); list2.Add(44); //list2.Add("mystring"); //list2.Add(new MyClass());
3.代码的重用、多态
List<T>这个泛型类在使用时可以根据需要用不同的类型实例化
List<int> list=new List<int>(); list.Add(44); List<string> stringList=new List<string>(); stringList.Add(“mystring”); List<MyClass> myclassList=new List<MyClass>(); myClassList.Add(new MyClass());
上面只是简单地介绍了一下泛型 的知识,泛型的具体使用会在下面的文章给出。
相关文章推荐
- [转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化
- c# 泛型中类型参数约束 之 主约束的解读
- c# where(泛型类型约束)
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- C#中的时间类型以及时间比较
- 编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
- <T extends Comparable<? super T>>泛型类型与<T extends Comparable<T>>的区别以及优越性
- C# 通过反射来动态创建泛型类型
- C# 泛型 无法将类型xx隐式转换为“T”
- java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
- 利用dynamic类型对C#泛型参数运算
- 泛型的内部原理:类型擦除以及类型擦除带来的问题
- C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现)
- java 泛型的内部原理:类型擦除以及类型擦除带来的问题
- C# 泛型 引用类型约束 值类型约束
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- 泛型类型参数(C# 编程指南)
- java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
- C#中使用泛型对比使用通用基础类型效率降低近一倍
- 泛型的内部原理:类型擦除以及类型擦除带来的问题