TOP

委托(一)
2017-10-10 12:46:30 】 浏览:10078
Tags:委托

 第一次写博客,经验不足,有很多地方考虑不到,还请大家海涵。

一. 委托的应用场景?
  1. 把方法当作参数传给其他方法时,需要使用委托。
二. 什么是委托?
     1. 委托是一种类型,属于引用类型,定义委托的关键字是 delegate ,在命名空间下以及类的内部都可以定义委托。
     2. 声明委托的语法:
        a. [访问修饰符] delegate 返回值类型 委托类型名 ([参数])
     3. 一个简单的委托应用:

 class Program
    {
        //声明一个委托
        delegate void DoSomething();
        static void Main(string[] args)
        {
            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;
            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);

          
            Console.ReadKey();
        }
        //定义一个符合委托类型DoSomething签名的方法
        static void LearningEnglish()
        {
            Console.WriteLine("背会单词吧。");
        }
        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
        {
            Console.WriteLine("睡前做点什么呢?");

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

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

  4. 委托的多种呈现方式:

 static void Main(string[] args)
        {
            #region 常规用法:

            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;
            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);

            #endregion

            #region 使用匿名方法

            DoSomethingBeforeSleep("Chris",delegate { Console.WriteLine("背会单词吧。"); });

            #endregion

            #region 使用Lambda语句

            DoSomethingBeforeSleep("Chris", () => { Console.WriteLine("背会单词吧。"); } );

            #endregion

            #region 使用Lambda表达式

            DoSomethingBeforeSleep("Chris", () => Console.WriteLine("背会单词吧。"));

            #endregion
            Console.ReadKey();
        }

 5. 通用委托(泛型委托):System.Action 、System.Func、System.Predicate(略)

  1.为了减少自定义委托类型的必要,.NET3.5(C#3.0)包含了一组通用的委托 。

    1.1 Action :代表无参数且没有返回值的方法。  

class Program
    {
        static void Main(string[] args)
        {

            DoSomethingBeforeSleep("Chris", LearningEnglish);
            Console.ReadKey();
        }

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

        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, Action doSomething) //Action 等价于 delegate void DoSomething() 这个类型的一个委托。
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke();

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

    1.2 Action<>:代表包含请求参数且没有返回值的方法,<>里定义参数的类型和个数。   

 class Program
    {
        static void Main(string[] args)
        {
            //调用包含委托的方法
            DoSomethingBeforeSleep("Chris", Learnning);

            Console.ReadKey();
        }

        //定义一个符合委托类型 delegate void DoSomething(string parameterName) 签名的方法
        static void Learnning(string subjectName)
        {
            Console.WriteLine($"学会儿{subjectName}吧。");
        }

        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, Action<string> doSomething) //Action 等价于 delegate void DoSomething(string parameterName) 这个类型的一个委托。
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke("英语"); //调用这个委托的实例,并传递一个string类型的参数

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

    1.3 Func<> :代表有返回值的方法,且<>中最后一个参数始终为返回值类型,之前的参数都为请求参数的类型。

class Program
    {
        static void Main(string[] args)
        {
            int times = 0;
            do
            {
                DoSomething("Chris", GetNowHour);
                times++;
            } while (times<10);
           
        }

        public static int GetNowHour()
        {
            return new Random().Next(0, 12);
        }

        public static voi  
		
委托(一) https://www.cppentry.com/bencandy.php?fid=106&id=131509

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