如何学好C# 开篇浅论<三>
至于后面三点我也就不再累述了。上面的一些方法也只是我一己之见,你可以在以上的基础上进行改良和创新,找到适合自己的,不是有句话说得好:发明=改良+创新吗?呵呵,在这一张我们谈谈C#语言对于初学者容易搞混淆的几个地方! 1.委托与事件。委托不是C#独有的什么东西。只是在不同种语言称呼有些不同罢了。在C++里面委托其实就是函数指针。定义委托需要用到关键字delegate,先让我们来看一下里面对委托的定义: delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。中文有点不符合我们的习惯,不过还好。这里指的方法签名就是指方法声明的类型,返回值,参量(参数),以及名称。你大致可以这样理解它:委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用静态方法。对于实例方法,委托对象要调用该实例上的一个方法。好的,让我们看一个实例: //************************************************************************* using System; using System.Threading; namespace ConsoleApplication6 { class Test { delegate void TestDelegate();// 声明一个委托 , 对应签名函数的类型 public static void Main() { TestDelegate tDelegate = new TestDelegate(TestFunction);// 像使用类一样使用它 tDelegate(); // 调用委托 , 即执行 TestFunction 函数体内的实现 } public static void TestFunction() // 静态函数 , 请注意和声明一个很委托的签明一样 , 在此是静态函数的原因是因为 Main 函数的声明是静态的 . { Console.WriteLine("This is a delegate function"); } } } //************************************************************************* 你会发现原来委托不过如此,没有什么神秘的啊!有人会问,我直接用一个函数调用不就行了吗?为什么要用委托了。呵呵,搞得这么麻烦,如果你是这样想的话,我想你应该忍住性子看完下面这个例子: //************************************************************************* using System; namespace ConsoleApplication6 { class Test { delegate void TestDelegate();// 声明一个委托 , 对应签名函数的类型 public static void Main() { TestDelegate tDelegate = new TestDelegate(TestFunction);// 像使用类一样使用它 tDelegate += TestFunction1;//vs2005 可以直接这样书写 . tDelegate(); // 调用委托 } public static void TestFunction() // 静态函数 , 请注意签名和声明一个很委托的签明一样 { Console.WriteLine("This is a delegate function"); } public static void TestFunction1()// 另外的静态函数 , 请注意签名和声明一个很委托的签明一样 { Console.WriteLine("This is a delegate function too!"); } } } 程序运行结果 : This is a delegate function This is a delegate function too! 由于程序里面使用 tDelegate += TestFunction1 (多点委托)所以运行 tDelegate 会现直接调用两个函数。当然只要你愿意 , 你也可以这样写 :tDelegate -= TestFunction1; 你也可以使用 tDelegate .combine和tDelegate.remove,来实现“+=“和“==”的效果。也许你还是会非常固执的说,那我也可以接在主函数里面换上这两句话啊! TestFunction(); TestFunction1(); 还是可以运行,为什么要用委托呢?好的请看下面的代码: using System; namespace ConsoleApplication6 { delegate void TestDelegate(); class Test { // 声明一个委托 , 对应签名函数的类型 public static void Main() { A a = new A(); a.testDelegate();// 调用委托 , 知道厉害了吧 . } } class A { public TestDelegate testDelegate; public A() { testDelegate = new TestDelegate (TestFunction) + TestFunction1;// 关联委托函数 . // 你也可以这么写 //testDelegate = new TestDelegate (TestFunction); //testDelegate += TestFunction1; } private void TestFunction() // 实例函数的签名 , 请注意签名和声明一个很委托的签明一样 { Console.WriteLine("This is a delegate function"); } private void TestFunction1()// 另外的一个实例函数的签名 , 请注意签名和声明一个很委托的签明一样 { Console.WriteLine("This is a delegate function too!"); } } } 还没有发现其中的好处吗?呵呵。他把实例类即 A ,函数有机的封装在一起了,使类的暴露性更小了。更加具有可读性,把 TestFunction , TestFunction1 前面的修辞符加上 static 看一下,照样可以运行。封装性在团队合作大型的项目中显得更加尤为重要,但是这只是委托的其中一个优点,其使用委托还可以节省很多开销 , 也就是使代码效率更高 . 当然,还有一个委托非常重要的一点,那就是下一章的主角 -- 事件(你可以把事件看做特殊的委托 , 一种特殊的表现)。它将会装委托的特质更加发挥出来。在下一章里面,你将看到委托结合事件的强大威力。