[笔记]C#自定义Generic类

原创 2007年10月05日 19:44:00

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, 23);  // (array, offset, count) 

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

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

c# generic的用法 class <T>

如果在一个类的声明中,想定义一个数组成员变量。数组的类型设计是可变,但是对数组的操作,基本是不变的。那么可以在类名后面用 /* * Created by SharpDevelop. * User...
  • CGGUANG
  • CGGUANG
  • 2016年11月15日 05:14
  • 527

C#笔记 泛型 Generic

泛型(generic)
  • fjl2007
  • fjl2007
  • 2015年07月13日 10:18
  • 341

Java中的泛型编程(generic programming)和泛型类(generic class)

泛型编程(generic programming)和泛型类(generic class)泛型编程(generic programming)意味着代码可以被不同类型的对象所复用。泛型类(generic ...
  • lichengyu
  • lichengyu
  • 2015年12月06日 10:49
  • 1667

C#中自定义异常

 在写方法时,是否遇见数据输入的错误呢.如果字符串格式不能转换成整型的什么.不过处理这些错误的异常,.Net已经都帮我们写好了.但是如果一个字符串输入你想判断他是不是二进制数..这种异常你会怎么处理呢...
  • yubo35033720
  • yubo35033720
  • 2007年05月22日 08:40
  • 4466

类属(Generic)

类属(Generic) 块和其环境进行通信的一个静态信息通道。 A channel for static information to be communicated to a block...
  • QQ604666459
  • QQ604666459
  • 2017年02月17日 16:13
  • 92

C# 泛型generic的简单理解

根据MSDN的一段话:泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时...
  • smooth_tailor
  • smooth_tailor
  • 2016年08月15日 10:23
  • 223

Generic Class和MFC Class和Form Class有何区别?

MFC Class表示从MFC类库派生,可以在Base class中选择父类。Form Class表示从CDialog派生的类,可以在Dialog ID中选择对话框资源ID。Generic Class...
  • wangjiwei2010
  • wangjiwei2010
  • 2006年09月19日 14:40
  • 1547

(C#)--返回自定义数据类型

// 自定义用户信息   public class UserInfo   {        public string strName; //用户名        public string ...
  • normal_cai
  • normal_cai
  • 2012年11月13日 14:02
  • 1285

C#自定义异常类型的方法和注意项

C#中的异常都是从SystemException(系统异常)和ApplicationException(应用程序异常)两个类派生而来, 在自定义异常类时通常都是从ApplicationExceptio...
  • u011390632
  • u011390632
  • 2013年12月08日 21:54
  • 2634

c# 自定义类库的引用方法

       在一个ASP.NET网站工程中增加了三个类库(即C#工程):Common, Data, Business,分别用于存放公共类,数据访问层类和业务层类的代码。      但是我用一般的引用...
  • ITsenlin
  • ITsenlin
  • 2009年10月25日 19:59
  • 5126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[笔记]C#自定义Generic类
举报原因:
原因补充:

(最多只允许输入30个字)