C# 泛性 学习记录

项目:xx

介绍:项目中,北京同事做了个 网元树 的控件,自己需要实现一个 基站树 的控件,因此参考 已经写好的网元树控件,由于代码中大量的用到了范型,因此,在此记录一些。

1:

  public interface IChild<T> where T : class, IChild<T> 

自己不理解的是:这个地方的class,以及class后面的IChild<T>,特别是后面的IChild<T>,根据自己的理解,

T的类型都要属于IChild,或者叫 至少是从IChild派生的类型。可是,在函数定义的时候,总的有个先后顺序,也就是说,要接口的参数是自己本身或者是继承的类型,这似乎不太对劲。(add by yanchanggang 20070901 或许可以这么理解:定义一个接口,该接口的参数是个引用类型,并且,该参数须是从IChild派生的类型)以下的文字,并不是介绍这点疑惑的,只是对这个地方的class的解释

知识点:范型约束

 详细介绍1:

参见:http://dev.yesky.com/msdn/405/2415905.shtml

泛型的Where

  泛型的Where能够对类型参数作出限定。有以下几种方式。

  ·where T : struct 限制类型参数T必须继承自System.ValueType。
  
  ·where T : class 限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。

  ·where T : new() 限制类型参数T必须有一个缺省的构造函数

  ·where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。

  以上这些限定可以组合使用,比如: public class Point<T> where T : class, IComparable, new()

详细介绍2:

参见:http://dev.csdn.net/article/80/80696.shtm

C#泛型要求对"所有泛型类型或泛型方法的类型参数"的任何假定,都要基于"显式的约束",以维护C#所要求的类型安全.

   "显式约束"有where字句表达,可以指定"基类约束","接口约束","构造器约束","值类型/引用类型约束"共四中约束.

   "显示约束"并非必须,如果没有指定"显式约束",泛型类型参数将只能访问System.Object类型中的公有方法.

基类约束

class A
{
   public void F1(){}
}
class B
{
   public void F2(){}
}

class C(S,T)
where S:A // S继承自A
where T:B // T继承自B
{
   // 可以在类型为S的变量上调用F1
   // 可以在类型为T的变量上调用F2
}

接口约束

interface IPrintable{coid Print();}
interface IComparable<T>{int CompareTo(T v);}
interface IKeyProvider<T>{T HetKey();}

class Dictionary<K,V>
  where K:IComparable<K>
  where V:IPrintable,IKeyProvider<K>
{
   // 可以在类型为K的变量上调用CompareTo
   // 可以在类型为V的变量上调用Print和GetKey
}

构造器约束

class A
{
   public A(){}
}
class B
{
   public B(int i)()
}

class C<T>
  where T:new()
{
   // 可以在其中使用T t = new T();
}
C<A> c = new C<A>(); // 可以,A有无参数构造器
C<B> c = new C<B>(); // 错误,B没有无参数构造器

值类型/引用类型约束

public struct A{...}
public class B{...}

class C<T>
where T : struct
{
 // T在这里面是一个值类型
}
C<A> c = new C<A>(); // 可以,A是一个值类型
C<B> c = new C<B>(); // 错误,B是一个引用类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值