C# 委托学习笔记(一)

a、委托是什么
1. 委托的定义:
使用delegate关键字定义委托(注:委托没有方法体,类似于接口中的方法)。委托定义前,需要明确的问题:

  • 是委托将要绑定的方法;
  • 是委托的形参类型、形参个数以及返回值,必须与将要绑定的方法的形参类型、形参个数及返回值一致。

2.相关概念:
委托涉及的相关概念有函数指针 、类型安全性、事件、Lambda表达式等。

  • 函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地址),可以吧C#中的委托理解为函数指针。
  • 类型安全性:在C++中,我们都知道指针是类型不安全的(返回值、返回类型以及什么时候返回,这些都是未知的),然而委托是类型安全的;
  • 事件:可以把事件理解为一种特殊的委托;
  • Lambda表达式:委托与Lambda表达式相结合,可以实现高效编程、它与jQuery中“使用较少的代码做更多的事”类似。委托与Lambda、Linq相结合,使较短的代码实现比较复杂的功能。

3.委托的组成:
主要分为两部分去实现:

  • 声明委托:使用delegate关键字声明;
  • 绑定方法(注册方法):绑定具体方法、传递方法名称。

4.委托的分类:

  • 单播委托:顾名思义只能绑定一个方法;
  • 多播委托:则可以绑定多个方法。

5.委托的操作:

  • 绑定方法;
  • 解绑方法。

b、委托能解决那些问题呢?

  1. 避免核心方法中存在太多的if…else…语句或者switch开关语句;
  2. 满足程序设计的OCP(开-闭原则)原则;
  3. 使得程序具有扩展性;
  4. 绑定事件;
  5. 结合Lambda表达式,简化代码,高效编程;
  6. 实现程序的松耦合(解耦),这种情况在事件(event)中体现的比较明显。

c、委托的使用:
1. 定义委托:

public delegate  委托返回的类型  委托名(形参)

2.使用委托,举例:

        static void Main(string[] args)
        {
            Console.WriteLine("----------请输入用户名:----------");
            string userName = Console.ReadLine();
            Console.WriteLine("----------请输入语言----------");
            string language = Console.ReadLine();
            GetPeopleGreetings getGreeetings = new GetPeopleGreetings();
            if (language.Equals("Chinese"))
                Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetChineseGreeting));
            else if (language.Equals("English"))
                Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetEnglishGreeting));
            else
                Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetOtherGreeting));
            Console.ReadKey();
        }
        /// <summary>
        /// 一个参数的委托
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="getGreetingsByDelegate"></param>
        /// <returns></returns>
        public static string GetGreetingsStrings(string userName, GetGreetingsByDelegate getGreetingsByDelegate)
        {
            return getGreetingsByDelegate(userName);
        }

定义委托:

  public delegate string GetGreetingsByDelegate(string userName);

定义给委托绑定的方法:

    public class GetPeopleGreetings
    {
        public string GetGreetingsByUserNameAndLanguage(string userName, string Language)
        {
            return $"你好!{userName},先生,您说的是“{Language}”语言吗?";
        }
        public string GetChineseGreeting(string userName)
        {
            return "您好!" + userName + "先生。";
        }
        public string GetEnglishGreeting(string userName)
        {
            return "Hello," + userName + "!";
        }
        public string GetOtherGreeting(string userName)
        {
            return "sorry!当前系统只支持汉语和英语。";
        }
    }

3.绑定方法:

  • 单播绑定:绑定单个方法,将单个方法名字传给委托即可(上面的例子就是单播绑定的实现);
Console.WriteLine("----------请输入用户名:----------");
string userName = Console.ReadLine();
Console.WriteLine("----------请输入语言----------");
string language = Console.ReadLine();
GetPeopleGreetings getGreeetings = new GetPeopleGreetings();
GetGreetingsByDelegate gg;
if (language.Equals("Chinese"))
{
gg = getGreeetings.GetChineseGreeting;
Console.WriteLine(gg(userName));
}
else if (language.Equals("English"))
{
gg = getGreeetings.GetEnglishGreeting;
Console.WriteLine(gg(userName));
}
else
{
gg = getGreeetings.GetOtherGreeting;
Console.WriteLine(gg(userName));
}
Console.ReadKey();
  • 多播绑定(绑定多个方法,注意:绑定多个方法时,委托范围类型必须为void类型,否则只返回最后一个绑定的值。),如下:
static void Main(string[] args)
  {
     GetPeopleGreetings greeetings = new GetPeopleGreetings();
     GetGreetingStrings gg;
     gg = greeetings.ChineseGreetings;
     gg += greeetings.EnglishGreetings;
     gg("谢文东!");
     Console.ReadKey();
  }

定义绑定多个方法的委托:

public delegate void GetGreetingStrings(string userName);

定义给委托绑定的方法:

public class GetPeopleGreetings
{
        public void ChineseGreetings(string userName)
        {
            Console.WriteLine($"你好!{userName},先生。");
        }
        public void EnglishGreetings(string userName)
        {
            Console.WriteLine($"Hello,{userName}!");
        }
}

总结,绑定多个方法时,用“+=”绑定。
4.委托解绑:
当然解载绑定的方法,我们用的是“-=”解绑的。

static void Main(string[] args)
  {
     GetPeopleGreetings greeetings = new GetPeopleGreetings();
     GetGreetingStrings gg;
     gg = greeetings.ChineseGreetings;
     gg += greeetings.EnglishGreetings;

     gg -= greeetings.ChineseGreetings;
     gg("谢文东!");
     Console.ReadKey();
  }

完。
此笔记参考资料来源于:https://www.cnblogs.com/wangjiming/p/8300103.html博客信息。

在那一刻,我意识到,我必须选择,要么对一切屈服,得过且过地生活,要么就得努力,争取过上梦想的生活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值