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

C# 泛型-创建自己的泛型

2013-06-18 12:06 337 查看
泛型是编程语言中的一种特性,它允许在强类型语言中,设计程序的时候不指定类型,而在使用的时候才明确类型。

说得直白点:一个方法要支持 int、decimal、string 等类型的参数,用重载?那重载也太多了吧。用 object 类型的参数?那装箱拆箱或强制类型转换操作也太浪费资源了吧,并且在编译时可能无法进行类型检查。并且我还想用同一个方法返回不同的类型值。

C# 中用泛型可以解决这些问题。C# 中泛型可用于结构接口、委托,及其成员。

使用泛型举例

using System.Collections.Generic;

List<int> l1 = new List<int>();

List<string> l2 = new List<string>();

l1.Add(1);

l2.Add("a");

m = l1[0];

a = l2[0];

可以看出,List 通过泛型,既方便地处理 int 类型,也方便地处理 string 类型。

第一个泛型方法

public class C

{

public T Foo<T>(T value)

{

return value;

}

}

C c = new C();

int i = c.Foo<int>(3) + 2;

decimal d = c.Foo<decimal>(30) + 20;

MessageBox.Show(i.ToString() + "\r\n" + d.ToString());

int j = c.Foo(3); // 也是正确的,编译器将自动推断类型。

如上实现了一个泛型(虽然这个 Foo 方法代码极其简单),但是通过指定 Foo<T> 明确了参数、返回值的类型。

有人会问:

是不是非得用 T 这个字母呢?我用 T1 可以吗?可以,随便。
是不是参数中非得用 T 类型,返回值非得用 T 类型呢?完全不是,只是根据你的需要,参数你也可以直接指定 int 类型,返回值你也可以指定为 string 类型,也可以不要返回值。

同时使用多个泛型

public void Foo<T1, T2>(T1 value1, T2 value2, int value3)

默认值

由于泛型不知道使用时的类型,所以它就不知道自己将是引用类型,还是值类型(分数值类型和结构类型)。我们希望引用类型时为变量赋 null 初始值,值类型中的数值类型时为变量赋 0 初始值。方法是使用 default 关键字。

T t = default(T);

泛型不是 object

泛型不是 object,不会涉及装箱、拆箱操作,所以以下代码均是错误的:

public int Foo<T>(T value)

{

return (int)value;

}

public T Foo<T>(T value1, T value2)

{

return value1 + value2;

}

泛型类

前面介绍了泛型方法,其实泛型类、泛型接口、泛型委托的创建都类似于泛型方法,以泛型类为例。

public class C<T>

{

public T Value1 { get; set;
}

public T Value2 { get; set;
}

public C(T value1, T value2)

{

Value1 = value1;

Value2 = value2;

}

public void Swap()

{

T t = Value1;

Value1 = Value2;

Value2 = t;

}

}

C<int> c1 = new C<int>(1,
2);

C<string> c2 = new C<string>("a", "b");

c1.Swap();

c2.Swap();

MessageBox.Show(c1.Value1.ToString() + c1.Value2.ToString() + c2.Value1 + c2.Value2);
http://www.cftea.com/c/2012/04/5535.asp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: