c#中的委托01

delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。

委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。 你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法(举个例子,Winform上拖拽完button,然后双击,后台生成这个button的点击事件,这样这个button的点击事件就跟你的方法绑定起来了)。

 

需求:遇到到不同国家的人,以不同方式跟他打招呼。

 

Talking is easy ,show me the codes .

namespace ConsoleDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            List<People> pp = new List<People>();
            pp.Add(new People { Name = "马大云", Country = "中国" });
            pp.Add(new People { Name = "Bill Gat", Country = "USA" });

            pp.ForEach(p => Say(p));
        }

        public static void Say(People p)
        {
            if (p != null && !string.IsNullOrEmpty(p.Country))
            {
                if (p.Country.Equals("中国", StringComparison.OrdinalIgnoreCase))
                {
                    Chinesenihao(p.Name);
                }
                if (p.Country.Equals("USA", StringComparison.OrdinalIgnoreCase))
                {
                    EnglishHello(p.Name);
                }
            }
        }
        public static void Chinesenihao(string name)
        {
            Console.WriteLine($"{name},老表,吃饭没?");
        }

        public static void EnglishHello(string name)
        {
            Console.WriteLine($"hi,{name},the weather is nice today.");
        }


    }

    public class People
    {
        public string Name { get; set; }
        public string Country { get; set; }
    }
}

上面这种实现是可以的,满足了需求,当再来几个国家,Say方法里面再加几个就阔以了。

但是当你工作几年后,你还这么写,那就不清真(zhuang bi shi bai )了。

Talking is easy ,show me the codes .

 public delegate void sayhellodelegate(string name);
    class Program
    {
       
        static void Main(string[] args)
        {
            
            List<People> pp = new List<People>();
            pp.Add(new People { Name = "马大云", Country = "中国" ,sayfunction= Chinesenihao });
            pp.Add(new People { Name = "Bill Gat", Country = "USA" ,sayfunction= EnglishHello });

            pp.ForEach(p => Say(p));
        }

        public static void Say(People p)
        {
            p.sayfunction(p.Name);
        }
        public static void Chinesenihao(string name)
        {
            Console.WriteLine($"{name},老表,吃饭没?");
        }

        public static void EnglishHello(string name)
        {
            Console.WriteLine($"hi,{name},the weather is nice today.");
        }


    }

    public class People
    {
        public string Name { get; set; }
        public string Country { get; set; }

        public sayhellodelegate sayfunction { get; set; }
    }

上面的代码中,sayhellodelegate当做一种类型在用。这也是为什么文章开头的那句是这样的:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型。

 

新需求:遇到到不同国家的人,以不同方式跟他打招呼,如果有多个国家的国籍,择使用多种方式打招呼。

 
static void Main(string[] args) { List<People> pp = new List<People>(); var t = new People { Name = "马大云", Country = "中国", sayfunction = Chinesenihao }; t.Country = "中国,USA"; t.sayfunction += EnglishHello; pp.Add(t); pp.Add(new People { Name = "Bill Gat", Country = "USA", sayfunction = EnglishHello }); pp.ForEach(p => Say(p)); }

其他代码不动,在给Sayfunction 赋值时坐了追加就满足了需求。

 

 

这是delegate的另外一个特性:

可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。

 

当然可以追加,也可以取消。

 

 

 

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

转载于:https://www.cnblogs.com/kim-meng/p/11473883.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#委托是一种类型,它可以用来引用一个或多个方法,并允许将方法作为参数传递给其他方法。委托的具体使用如下: 1. 定义委托类型:首先需要定义一个委托类型,可以使用`delegate`关键字来定义。例如,定义一个委托类型`MyDelegate`: ```csharp delegate void MyDelegate(string message); ``` 2. 创建委托实例:可以使用委托类型来创建委托实例,将其与一个或多个方法关联起来。例如,创建一个委托实例`myDelegate`并关联一个方法`PrintMessage`: ```csharp void PrintMessage(string message) { Console.WriteLine(message); } MyDelegate myDelegate = new MyDelegate(PrintMessage);``` 3. 调用委托:通过委托实例可以调用关联的方法。例如,通过`myDelegate`调用关联的方法`PrintMessage`: ```csharp myDelegate("Hello, World!"); ``` 4. 多播委托委托还支持多播(多个方法)调用。可以使用`+=`和`-=`操作符来添加和移除方法。例如,添加一个方法`PrintAnotherMessage`到委托实例`myDelegate`: ```csharp void PrintAnotherMessage(string message) { Console.WriteLine("Another message: " + message); } myDelegate += PrintAnotherMessage; ``` 5. 委托作为参数:委托可以作为方法的参数传递。例如,定义一个方法`ProcessMessage`,接受一个委托类型的参数: ```csharp void ProcessMessage(MyDelegate delegateInstance, string message) { delegateInstance(message); } ProcessMessage(myDelegate, "Hello, C#!"); ``` 6. 匿名方法和Lambda表达式:除了使用命名方法,还可以使用匿名方法和Lambda表达式来创建委托实例。例如,使用Lambda表达式创建一个委托实例: ```csharp MyDelegate myDelegate = (message) => Console.WriteLine(message); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值