泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险,如下所示:C# 复制代码 // Declare the generic class public class GenericList<T> { void Add(T input) { } } class TestGenericList { private class ExampleClass { } static void Main() { // Declare a list of type int GenericList<int> list1 = new GenericList<int>(); // Declare a list of type string GenericList<string> list2 = new GenericList<string>(); // Declare a list of type ExampleClass GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); } } 泛型概述 使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。.NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。可以对泛型类进行约束以访问特定数据类型的方法。关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。
// Declare the generic class
public class GenericList<T>
{
void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int
GenericList<int> list1 = new GenericList<int>(); // Declare a list of type string
GenericList<string> list2 = new GenericList<string>(); // Declare a list of type ExampleClass
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
}
} 泛型概述
使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。.NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。可以对泛型类进行约束以访问特定数据类型的方法。关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。
List<int>
List<string>
List<YourClass>
定义这样的对象之后,就相当于得到了这样的对象列表,而且支持对类型的检查。比如:
List<YourClass> yc;
yc.Add(MustBeAYcClassObject);//这个Add函数的签名类似于Add(YourClass yc);(只是类似,实际上应该是Add<T>(T t);)
通过泛型一是可以得到强类型的对象,如上面说的。添加到List<YourClass>对象中的元素必须是YourClass类型否则会出错。
在没有泛型之前,你必须定义成这样:
List aListOfObject;
对于添加函数:
aListofObject.Add(AnyObject); //这个Add函数的签名类似于Add(Object o);也就是说你用任何变量做参数都是可以的,这就埋下了错误的种子;
对于取出数据更可怕,假如你的整个aListOfObject都“预计”存放YourClass类型的对象,取出数据时你必须这样处理:
(YourClass)aListofObject[0]; //强制类型转换。
如果不成功,你就玩完了,当然你可以通过
aListofObject[0] as YourClass;
这种方式来避免异常,但你仍然需要处理返回的null值。泛型的支持还体现在其它一些算法上,比如:
List<T> 这种类型支持Sort()排序,你只需要传入一个合适的比较委托就可以实现你的要求了。
如果确是映射这个词的话,在C#中本身是没有的,但它的应用有很多。比如:LINQ中就有一些关系映射等。
事件在本质是上委托,但它不是一个委托,是一系列委托,并且是可重复的委托。
以某个按钮为例,我写一个假定的按钮点击过程。public class Button
{
private delegate void ButtonClickDelegate(); private event ButtonClickDelegate ButtonClick; private void SomeFuncAfterMouseUp()
{
ButtonClick();
}
}其中SomeFuncAfterMouseUP是在程序运行过程中的某个位置检测到一个“事情”发生了,比如:当检测到鼠标在这个BUTTON上的UP事件时,可以认为有一个点击事件发生了,这时调用事件ButtonClick();就相当于调用一系列赋值于ButtonClick上的委托。
http://msdn.microsoft.com/zh-cn/library/ms172192(VS.80).aspx
http://topic.csdn.net/u/20080626/17/1742fccb-1513-4543-9f9f-045660d24666.html
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
} 只有当事件生成事件数据时才需要自定义事件委托。许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。其声明如下。delegate void EventHandler(object sender, EventArgs e);
事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见 Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件。有关在您的应用程序中使用事件的概述,请参见使用事件。
{
private delegate void ButtonClickDelegate(); private event ButtonClickDelegate ButtonClick; private void SomeFuncAfterMouseUp()
{
if(ButtonClick!=null)
ButtonClick();
}
}为了加深理解,再写一段如何使用这个事件的代码:
public static void ShowButtonClickEvent()
{
MessageBox.Show("按钮被按下了……");
}public static Main()
{
Button btn = new Button;
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick -=ShowButtonClickEvent;
}第一个方法就是事件的响应委托,当事件发生时将执行这个委托。
关注后面的几行代码:
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick +=ShowButtonClickEvent;
btn.ButtonClick -=ShowButtonClickEvent;
这里是给这下事件添加了3个委托,然后又删除了一个委托。
注意这里的规则中-=只删除第一个遇到的ShowButtonClickEvent,所以执行了一次-=操作不会删除所有的ShowButtonClickEvent,最终这个委托将被执行2次。
再看c#的
泛型 ,值得学习