请达人帮解释,并举例说明其应用

解决方案 »

  1.   

    泛型是 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。您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。可以对泛型类进行约束以访问特定数据类型的方法。关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。
      

  2.   

    1:泛型用法很广泛,简单点说两个:
    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()排序,你只需要传入一个合适的比较委托就可以实现你的要求了。
      

  3.   

    2:映射我没明白你说的意思,是指反射吗?
    如果确是映射这个词的话,在C#中本身是没有的,但它的应用有很多。比如:LINQ中就有一些关系映射等。
      

  4.   

    3:事件。
    事件在本质是上委托,但它不是一个委托,是一系列委托,并且是可重复的委托。
    以某个按钮为例,我写一个假定的按钮点击过程。public class Button
    {
       private delegate void ButtonClickDelegate();   private event ButtonClickDelegate ButtonClick;   private void SomeFuncAfterMouseUp()
       {
        ButtonClick();
       }
    }其中SomeFuncAfterMouseUP是在程序运行过程中的某个位置检测到一个“事情”发生了,比如:当检测到鼠标在这个BUTTON上的UP事件时,可以认为有一个点击事件发生了,这时调用事件ButtonClick();就相当于调用一系列赋值于ButtonClick上的委托。
      

  5.   

    泛型的内容很广,不是一两句说清楚的.你自己看吧.
    http://msdn.microsoft.com/zh-cn/library/ms172192(VS.80).aspx
      

  6.   

    事件(委托)看看这里的例子
    http://topic.csdn.net/u/20080626/17/1742fccb-1513-4543-9f9f-045660d24666.html
      

  7.   

    关于处理和引发事件:http://msdn.microsoft.com/zh-cn/library/edzehd2t.aspx,非常详细事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。下面的示例显示了事件委托声明。C#  复制代码 
    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。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。有关使用委托在您的组件或控件中提供事件功能的详细信息,请参见引发事件。有关在您的应用程序中使用事件的概述,请参见使用事件。
      

  8.   

    附上述代码有一个小小的缺陷:在调用某个事件之前必须对事件进行一个非空的检查。因为这个事件可能没有被赋值,也就是没有任何与之相关的委托存在,这时程序会报错,所以需要这样:public class Button
    {
       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次。
      

  9.   

    去MSDN里看吧。这里怎么能说明白呢。
      

  10.   

    正如楼上的兄弟们所言,这几个概念其中是非常广泛而深奥的,我的例子只是给你一个初步的感性认识,要想准确的理解这些概念并加以运用你还需要多查看有关的资料,主要是MSDN。一定要习惯阅读英文文档。
      

  11.   

    泛型还是看c++ template先
    再看c#的
      

  12.   

    还是看msdn好,要不就得去买本书。
      

  13.   

    [Quote=引用 18 楼 chenshuaijunsfsf 的回复:]
    泛型 ,值得学习
      

  14.   

    泛型用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替 ,在类实例化时指定T的类型,运行时(Runtime)自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全。 泛型可以在集合、类、方法上使用。