C#泛型学习笔记之一(约束)

本文介绍了泛型编程中不同类型约束的应用,包括一般约束、派生约束和构造函数约束,并解释了如何利用这些约束来提高代码质量和编译器的类型检查能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型可以使代码重用率提高

泛型需要编译器解决类型安全并降低装箱拆箱引发的性能损耗

泛型给编译器带来的问题:约束

约束分为:

1.一般约束

T Find(K key)
{
   Node current = m_Head;
   while(current.NextNode != null)
   {
      if(current.Key == key) //编译将不能通过
         break;
      else
         current = current.NextNode;
   }
   return current.Item;
}

以上编译错误是因为编译器无法保证Key类中包含==操作而引发

若要避免可将代码加上约束where 关键字,此关键字等于告诉编译器K实现了Icomparable的接口,附带的好处是将会在此类中为K类型的变量提供智能提示。

public class LinkedList where K : IComparable
{
   T Find(K key)
   {
      Node current = m_Head;
      while(current.NextNode != null)
      {
         if(current.Key.CompareTo(key) == 0)
           
            break;
         else     
           
            current = current.NextNode;
      }
      return current.Item;
   }
   //Rest of the implementation
}

可以为某个类提供多个约束

public class LinkedList where K : IComparable
                             where T : ICloneable

{...}

2.派生约束

可以为某个子类K提供派生约束如下
public class MyBaseClass
{...}
public class LinkedList where K : MyBaseClass
{...}

同样加上where关键字等同于告诉编译器K继承自MyBaseClass类,可以在LinkedList中为K提供智能提示

注意:

在此类约束中必须注意子类以及基类的访问控制

public class MyBaseClass
{}
internal class MySubClass where T : MyBaseClass
{}

是没有问题的。但是,如果这两个类的可见性被颠倒,例如:
internal class MyBaseClass
{}
public class MySubClass where T : MyBaseClass
{}
则编译器会发出错误,因为程序集外部的任何客户端都无法使用一般类型 MySubClass,从而使得 MySubClass 实际上成为内部类型而不是公共类型。外部客户端无法使用 MySubClass 的原因是,要声明 MySubClass 类型的变量,它们需要使用派生自内部类型 MyBaseClass 的类型。

3.构造函数约束

class Node where T : new()
{
   public K Key;
   public T Item;
   public Node NextNode;
   public Node()
   {
      Key      = default(K);
      Item     = new T();
      NextNode = null;
   }
}

加上new()关键字,等同于告诉编译器T类型一定包含有无参数的(默认的)构造函数。

可以将构造函数约束与派生约束组合起来,前提是构造函数约束出现在约束列表中的最后:

public class LinkedList where K : IComparable,new()
{...}

 

 

MSDN上泛型的介绍:http://msdn2.microsoft.com/zh-cn/library/ms379564(vs.80).aspx#EWAA

以及示例:下载GenericsInCSharp.msi 示例文件

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值