=波波日志 > Asp.Net/C#/WCF > 什么是C#泛型=
[转]什么是C#泛型
泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
C#泛型的作用概述:
C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。
在一个方法中,一个变量的值是可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显的好处是--类型安全和减少装箱、拆箱。
下面我们先看一个例子,说明为什么要使用泛型。
我们在程序的入口点处运行,在集合中增加了一个其他类型的对象,但插入数据的时候并没有报错,编译也可以通过,但把“谁是功夫之王?”这样的字段转换成人员的时候出问题了,这说明ArrayList是类型不安全的。
这根本原因在于ArrayList和HashTable集合把每个元素都当作Object类型,在添加元素时不做类型检查,进行了装箱操作,将所有的数据类型都转换为object类型。检索元素时,对存储元素进行拆箱才可以还原数据,如此频繁和进行装箱与拆箱,对系统的性能提出了更高的要求,同时每次都要进行强制类型转换也很麻烦,容易出错。为了解决这个问题,C#引入了泛型技术。
将上面的代码改为:
这段代码会报错,去掉这一句peoples.Add("谁是功夫之王?");就会正常运行。
C#泛型的作用概述:
C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。
在一个方法中,一个变量的值是可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显的好处是--类型安全和减少装箱、拆箱。
下面我们先看一个例子,说明为什么要使用泛型。
+展开
-C#
using System;
using System.Collections;
public class Person
{
public Person(string Name, int Age)
//构造函数
{
this.age = Age;
this.name = Name;
}
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
}
class Program
{
static void Main()
{
ArrayList peoples = new ArrayList();
peoples.Add(new Person("李小龙", 17));
peoples.Add(new Person("成龙", 17));
peoples.Add("谁是功夫之王?");
foreach (Person p in peoples)
{
Console.WriteLine(p.Name + "今年" + p.Age + "岁");
}
}
}
using System.Collections;
public class Person
{
public Person(string Name, int Age)
//构造函数
{
this.age = Age;
this.name = Name;
}
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
}
class Program
{
static void Main()
{
ArrayList peoples = new ArrayList();
peoples.Add(new Person("李小龙", 17));
peoples.Add(new Person("成龙", 17));
peoples.Add("谁是功夫之王?");
foreach (Person p in peoples)
{
Console.WriteLine(p.Name + "今年" + p.Age + "岁");
}
}
}
我们在程序的入口点处运行,在集合中增加了一个其他类型的对象,但插入数据的时候并没有报错,编译也可以通过,但把“谁是功夫之王?”这样的字段转换成人员的时候出问题了,这说明ArrayList是类型不安全的。
这根本原因在于ArrayList和HashTable集合把每个元素都当作Object类型,在添加元素时不做类型检查,进行了装箱操作,将所有的数据类型都转换为object类型。检索元素时,对存储元素进行拆箱才可以还原数据,如此频繁和进行装箱与拆箱,对系统的性能提出了更高的要求,同时每次都要进行强制类型转换也很麻烦,容易出错。为了解决这个问题,C#引入了泛型技术。
将上面的代码改为:
+展开
-C#
using System;
using System.Collections;
using System.Collections.Generic;
public class Person
{
public Person(string Name, int Age)
//构造函数
{
this.age = Age;
this.name = Name;
}
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
}
class Program
{
static void Main(string[]args)
{
List < Person > peoples = new List < Person > ();
peoples.Add(new Person("成龙", 18));
peoples.Add(new Person("李小龙", 17));
peoples.Add("谁是功夫之王?");
foreach (Person person in peoples)
{
Console.WriteLine(person.Name + "今年" + person.Age + "岁。");
}
}
}
using System.Collections;
using System.Collections.Generic;
public class Person
{
public Person(string Name, int Age)
//构造函数
{
this.age = Age;
this.name = Name;
}
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
}
class Program
{
static void Main(string[]args)
{
List < Person > peoples = new List < Person > ();
peoples.Add(new Person("成龙", 18));
peoples.Add(new Person("李小龙", 17));
peoples.Add("谁是功夫之王?");
foreach (Person person in peoples)
{
Console.WriteLine(person.Name + "今年" + person.Age + "岁。");
}
}
}
这段代码会报错,去掉这一句peoples.Add("谁是功夫之王?");就会正常运行。
类别:Asp.Net/C#/WCF 作者:转载 日期:2012-02-09 【评论:0】
相关文章
暂时没有评论!
发表留言
热门博文
- IE里Cookie跨域不能读取
- web服务因URL意外地以/**结束,请求格式无法识别
- 去掉隐藏asp.net编译出错aspxerrorpath错误参数
- 解决asp.net验证视图状态 MAC 失败
- 找不到System.Web.Script.Services.ScriptService
- 在aspx,ashx页面挂起线程执行
最新博文
- WCF授权-通过扩展自行实现服务授权
- WCF授权-ASP.NET Roles授权[下篇]
- WCF授权-ASP.NET Roles授权[上篇]
- WCF授权-模拟在WCF中的应用
- WCF授权-模拟(Impersonation)与委托(Delegation)
- WCF授权-基于Windows用户组授权[下篇]
随机博文
- DataSet导出到Excel文件
- WCF可靠会话目录
- C# 获取 IE 临时文件
- ASP.net获取上传Flash文件的宽和高
- C#通讯编程--《银证转帐系统》的通信代码
- 7.2 使用SQL Server 2005 管理数据库
广告商赞助

