如何学好C# 开篇浅论3

  如何学好C# 开篇浅论<三>

至于后面三点我也就不再累述了。上面的一些方法也只是我一己之见,你可以在以上的基础上进行改良和创新,找到适合自己的,不是有句话说得好:发明=改良+创新吗?呵呵,在这一张我们谈谈C#语言对于初学者容易搞混淆的几个地方!
1.委托与事件。委托不是C#独有的什么东西。只是在不同种语言称呼有些不同罢了。在C++里面委托其实就是函数指针。定义委托需要用到关键字delegate,先让我们来看一下CSDN里面对委托的定义: 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 .combinetDelegate.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 看一下,照样可以运行。封装性在团队合作大型的项目中显得更加尤为重要,但是这只是委托的其中一个优点,其使用委托还可以节省很多开销 , 也就是使代码效率更高 . 当然,还有一个委托非常重要的一点,那就是下一章的主角 -- 事件(你可以把事件看做特殊的委托 , 一种特殊的表现)。它将会装委托的特质更加发挥出来。在下一章里面,你将看到委托结合事件的强大威力。
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值