Unity3D游戏开发之C#的代理与事件.doc
上传人:qw****27 上传时间:2024-09-11 格式:DOC 页数:8 大小:40KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Unity3D游戏开发之C#的代理与事件.doc

Unity3D游戏开发之C#的代理与事件.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Unity3D游戏开发之C#的代理与事件代理(Delegate)大多数情况下,当调用函数时我们会指定要直接调用的函数。比如类MyClass如具有一个名为Process的函数,我们通常会按如下方法进行调用:MyClassmyClass=newMyClass();myClass.Process();这种调用在大多数情况下都是可行的。但是有些时候,我们不想直接调用函数,而希望能够将它传递给其他人,让他们进行调用。在以事件驱动的系统(如图形用户界面)中,这种方法尤为有用。例如当我需要在用户单击某个按钮即可执行一些代码时,或者当我要记录一些信息但却无法指定记录方式时。考虑以下示例:publicclassMyClass{publicvoidProcess(){Console.WriteLine(“Process()begin”);//这里还有其他东西…Console.WriteLine(“Process()end”);}}在此类中,我们进行一些记录,以了解函数的开始时间和结束时间。但是,我们的记录仅限于发送到控制台,这可能不是我们所需要的。我们真正需要的是能够控制从函数外部记录信息的位置,同时不必使函数代码变得复杂。在这种情况下,代理便是理想的解决方法。代理使我们可以指定将要调用的函数,看起来好像不需要指定哪个函数一样。对代理的声明类似于对函数的声明,不同的是在这种情况下,我们所声明的是此代理可引用的函数签名。我们的例子将声明一个带有单个字符串参数且没有返回类型的代理。修改该类如下:publicclassMyClass{publicdelegatevoidLogHandler(stringmessage);publicvoidProcess(LogHandlerlogHandler){if(logHandler!=null)logHandler(“Process()begin”);//这里还有其他东西if(logHandler!=null)logHandler(“Process()end”);}}使用代理与直接调用函数相似。只是在调用函数前,我们需要检查代理是否为空(即不指向一个函数)。要调用Process()函数,我们需要声明一个与代理相匹配的记录函数,然后创建代理的实例,以指向该函数。然后,将此代理传递给Process()函数。classTest{staticvoidLogger(strings){Console.WriteLine(s);}publicstaticvoidMain(){MyClassmyClass=newMyClass();MyClass.LogHandlerlh=newMyClass.LogHandler(Logger);myClass.Process(lh);}}Logger()函数是一个我们要从Process()函数中调用的函数,我们对它进行了声明,使其与代理相匹配。在Main()中,我们创建代理的一个实例,然后将该函数传递给代理构造函数,使其指向该函数。最后,我们将代理传递给Process()函数,该函数接着调用Logger()函数。如果您习惯于使用C++语言,您可能会认为代理很像函数指针,这种想法非常接近于事实。但是,代理并不“仅仅”是函数指针,它还提供了其它多种功能。文章出处【狗刨学习网】传递状态(PassingState)在上面的简单示例中,Logger()函数仅仅是输出些字符串。一个不同的函数可能把信息记录到文件中,但是要进行这种操作,该函数需要知道把信息写道什么文件中。对于Win32®而言,当您传递函数指针时,可随之传递状态。但是对于C#,这就没有必要了,因为代理既可指向静态函数,“也”可指向成员函数。以下是一个有关如何指向成员函数的示例:classFileLogger{FileStreamfileStream;StreamWriterstreamWriter;publicFileLogger(stringfilename){fileStream=newFileStream(filename,FileMode.Create);streamWriter=newStreamWriter(fileStream);}publicvoidLogger(strings){streamWriter.WriteLine(s);}publicvoidClose(){streamWriter.Close();fileStream.Close();}}classTest{publicstaticvoidMain(){FileLoggerfl=newFileLogger(“process.log”);MyClassmyClass=newMyClas