设为首页 加入收藏

TOP

委托(二)
2017-10-10 12:46:30 】 浏览:10116
Tags:委托
d
DoSomething(string name ,Func<int> whatTime) //Func<int> 等价于委托 delegate int DoSomething(); { var hour = whatTime.Invoke(); switch (hour) { case 5: Console.WriteLine($"{name}该起床"); break; case 7: Console.WriteLine($"{name}出门"); break; case 12: Console.WriteLine($"{name}吃午饭"); break; default: Console.WriteLine($"{name}不知道该干什么了。"); break; } }

  6.多播委托 :一个含有多个方法的委托

  6.1:不要依赖于为委托增加方法时的顺序,虽然有时看起来一致。

    6.2 : 多播委托中只能存储同一类型的委托.

 class Program
    {
        //声明一个委托
        internal delegate void DoSomething();
        static void Main(string[] args)
        {
            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;

            //多播委托:为一个委托实例赋予多个方法
            onEvening += WatchTV;
            onEvening += PlayGames;

            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);

            Console.ReadKey();
        }
        //定义一个符合委托类型DoSomething签名的方法
        static void LearningEnglish()
        {
            Console.WriteLine("背会单词吧。");
        }

        static void WatchTV()
        {
            Console.WriteLine("看会电视吧。");
        }

        static void PlayGames()
        {
            Console.WriteLine("玩会游戏吧。");
        }
        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke(); //等价于 doSomething();

            Console.WriteLine($"{name}:我要睡觉了。");
        }

    6.3 可以通过调用GetInvocationList()方法, 返回当前委托中的所有方法的返回值.  

Delegate [] delegate = onEvening.GetInvocationList();

    6.4 多次为同一个委托对象赋值时,后者会覆盖前者。

  DoSomething onEvening = LearningEnglish;
  onEvening = WatchTV;  //覆盖LearningEnglish 方法
  onEvening = PlayGames; //覆盖 WatchTV 方法

   6.5 多播委托中,如果其中某个方法执行时发生异常,则后续的方法不再执行.

 class Program
    {
        //声明一个委托
        internal delegate void DoSomething();
        static void Main(string[] args)
        {
            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;

            onEvening = WatchTV;  //覆盖LearningEnglish 方法
            onEvening = PlayGames; //覆盖 WatchTV 方法

            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);

            Console.ReadKey();
        }
        //定义一个符合委托类型DoSomething签名的方法
        static void LearningEnglish()
        {
            Console.WriteLine("背会单词吧。");
        }

        static void WatchTV()
        {
            Console.WriteLine("看会电视吧。");
            throw new Exception("这里出了一个BUG");
        }

        static void PlayGames()
        {
            Console.WriteLine("玩会游戏吧。");
        }
        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke(); //等价于 doSomething();

            Console.WriteLine($"{name}:我要睡觉了。");
        }
    }

7. 委托中的协变、逆变、闭包

  7.1 闭包:通过Lambda表达式访问Lambda表达式块外的变量,这称之为闭包,闭包是一个非常好的功能,但如果使用不当,也会非常危险。(引自 C#高级编程 8.3.3)

 static void Main(string[] args)
        {
            int someva l = 5;
            Func<int, int> f = x => x + someva l;
            Console.WriteLine(f(3));
            someva l = 7;
            Console.WriteLine(f(3));

            Console.ReadKey();
        }

 本篇博客参考:《C#高级编程》、《C#本质论》、《MDSN》、http://www.cnblogs.com/DeepLearing/p/4594518.html

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇在使用HttpClient做客户端调用一.. 下一篇C# TCPListener

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目