您的位置:首页 > 编程语言 > C#

c# 中的泛型以及强类型与弱类型

2015-05-04 15:40 162 查看
一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时其类型便是明确的:String便是String,Int32就是Int32。强类型的语言有以下几点好处:

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());


上面只是简单地介绍了一下泛型 的知识,泛型的具体使用会在下面的文章给出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: