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

本文介绍 C# 中泛型的基础概念及应用实例,包括如何使用泛型简化代码、提高性能,以及如何定义泛型方法和类。

泛型是编程语言中的一种特性,它允许在强类型语言中,设计程序的时候不指定类型,而在使用的时候才明确类型。

说得直白点:一个方法要支持 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 {  getset; }
     public T Value2 {  getset; }

     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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值