您的位置:首页 > 编程语言 > C#

C#学习笔记(10)——再谈委托,不同国家问候的例子

2017-06-14 09:12 786 查看
说明(2017-6-14 09:08:38):

1. 首先是一个简单的委托

(1)命名空间下定义一个委托MyDel:

public delegate void MyDel(string name);

这个委托其实就是个壳,用来替换后面的EnglishSayHello和ChineseSayHello。

(2)声明一个函数SayHello来存放这个委托:public static void SayHello(string name,MyDel del)。

(3)然后在主函数里就可以使用这个SayHello函数调用委托,里面就可以换这两个方法了:

SayHello("Jack",EnglishSayHello);
SayHello("Ashley",ChineseSayHello);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11控制台委托
{
public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
SayHello("Jack",EnglishSayHello);
SayHello("Ashley",ChineseSayHello);
Console.ReadKey();
}
public static void SayHello(string name,MyDel del)
{
del(name);
}

public static void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! "+name);
}
public static void ChineseSayHello(string name)
{
Console.WriteLine("早上好!"+name);
}
}
}


2. 然后是委托的绑定:

其实可以不需要SayHello这个中间方法的,直接在主函数里实例化一个委托,但是不能new Delegate(),因为会提示“没有0个参数的重载”。

要这样,赋值一个方法:

MyDel del = EnglishSayHello;

再这样,再绑定一个方法:

del += ChineseSayHello;

调用这个委托后,会依次调用所有绑定的方法,所以直接输出两句问候了:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11控制台委托
{
public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
MyDel del = EnglishSayHello;
del += ChineseSayHello;
del("Jack");
//SayHello("Jack",EnglishSayHello);
//SayHello("Ashley",ChineseSayHello);
Console.ReadKey();
}
//public static void SayHello(string name,MyDel del)
//{
//    del(name);
//}

public static void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! "+name);
}
public static void ChineseSayHello(string name)
{
Console.WriteLine("早上好!"+name);
}
}
}


3. 修改一下代码,以便下面引出事件:

这个做法不保密,如果用private修饰符,不能访问就失去委托的意义了;如果用public修饰符,委托可以随便赋值了不安全。因此需要使用事件event,将委托进行封装,只能+=和-=,不能=赋值。相当于字段与属性。

(1)MyDelegate类,把上面的几个方法放到单独的类文件里(实际开发中的样子),并且在类里直接定义一个MyDel类型的del字段,在SayHello里,判断一下del是否为空,不为空就调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11控制台委托
{
public delegate void MyDel(string name);
class MyDelegate
{
public MyDel del;
public void SayHello(string name)
{
if (del != null)
{
del(name);
}

}
public void EnglishSayHello(string name)
{
Console.WriteLine("Good Morning! " + name);
}
public void ChineseSayHello(string name)
{
Console.WriteLine("早上好!" + name);
}
}
}


(2)Program类,实例化MyDelegate,将md.del赋值和绑定两个方法,md.SayHello的时候就只带name参数就可以了,不需要del参数了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11控制台委托
{
//public delegate void MyDel(string name);
class Program
{
static void Main(string[] args)
{
MyDelegate md = new MyDelegate();
md.del = md.EnglishSayHello;
md.del += md.ChineseSayHello;
md.SayHello("Jack");

Console.ReadKey();
}
}
}


4. 事件,到这里其实就很简单了,把上面的代码简单修改两处:

(1)在MyDel委托前面加个event关键字:



(2)这时候就会提示:



将=变成+=,问题解决:



参考资料:

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: