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

C# 泛性 学习记录

2007-09-01 17:10 316 查看
项目: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是一个引用类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: