[笔记]C#自定义Generic类

Generic是Framework 2.0的新元素,中文名字称之为“泛型” (我总是记不住这个名字 = =+)特征是一个带有尖括号的类,比如List<T>

在C#中,泛型用得最广泛的地方,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。

这里只讨论自定义泛型类。基本自定义如下:

public   class  MyGeneric  < T >
{
    
private T member;
    
public void Method (T obj)
    
{
    }

}

这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。

public   class  MyGeneric  < TKey, TValue >
{
     
private TKey key;
     
private TValue value;

     
public void Method (TKey k, TValue v)
     
{
     }

}

泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。

限制:如果我们知道,这个将要传入的范性类T,必定具有某些的属性,那么我们就可以在MyGeneric<T>中使用T的这些属性。这一点,是通过interface来实现的。

//  先定义一个interface
public   interface  IDocument
{
   
string Title {get;}
   
string Content {get;}
}


//  让范型类T实现这个interface
public   class  MyGeneric  < T >
where  T : IDocument
{
     
public void Method(T v)
     
{
          Console.WriteLine(v.Title);
     }

}


//  传入的类也必须实现interface
public   class  Document : IDocument
{
......
}


//  使用这个泛型
MyGeneric < Document >  doc  =   new  MyGeneric < Document > ();

泛型方法:我们同样可以定义泛型的方法

void  Swap < T >  ( ref  T x,  ref  T y)
{
T temp 
= x;
= y;
= temp;
}

泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理

public   delegate   void  delegateSample  < T >  ( ref  T x,  ref  T y)

private   void  Swap ( ref  T x,  ref  T y)
{
    T temp 
= x;
    x 
= y;
    y 
= temp;
}


//  调用
public   void  Run()
{
   
int i,j;
   i 
= 3;
   j 
= 5;
   delegateSample
<int> sample = new delegateSample<int> (Swap);
   sample(i, j);
}

设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable<T>可以解决这个问题。

Nullable < int >  x;    //  这样就设置了一个可空的整数变量x
=   4 ;
+=   3 ;
if  (x.HasValue)    //  使用HasValue属性来检查x是否为空
{ Console.WriteLine ("x="+x.ToString());
}

=   null ;     //  可设空值

 使用ArraySegment<T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。

int [] arr  =   {123456789} ;
//  第一个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数
ArraySegment < int >  segment  =   new  ArraySegment < int > (arr,  2 3 );   //  (array, offset, count) 

for  ( int  i  =  segment.Offset; i <=  segment.Offset  +  segment.Count; i ++ )
{
   Console.WriteLine(segment.Array[i]);    
// 使用Array属性来访问传递的数组
}

在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值