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

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

ID:39891030

大小:40.00 KB

页数:8页

时间:2019-07-14

Unity3D游戏开发之C#的代理与事件_第1页
Unity3D游戏开发之C#的代理与事件_第2页
Unity3D游戏开发之C#的代理与事件_第3页
Unity3D游戏开发之C#的代理与事件_第4页
Unity3D游戏开发之C#的代理与事件_第5页
资源描述:

《Unity3D游戏开发之C#的代理与事件》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Unity3D游戏开发之C#的代理与事件代理(Delegate)      大多数情况下,当调用函数时我们会指定要直接调用的函数。比如类 MyClass 如具有一个名为 Process 的函数,我们通常会按如下方法进行调用:MyClassmyClass=newMyClass();myClass.Process();      这种调用在大多数情况下都是可行的。但是有些时候,我们不想直接调用函数,而希望能够将它传递给其他人,让他们进行调用。在以事件驱动的系统(如图形用户界面)中,这种方法尤为有用。例如当

2、我需要在用户单击某个按钮即可执行一些代码时,或者当我要记录一些信息但却无法指定记录方式时。考虑以下示例:publicclassMyClass{publicvoidProcess(){Console.WriteLine(“Process()begin”);//这里还有其他东西…Console.WriteLine(“Process()end”);}}      在此类中,我们进行一些记录,以了解函数的开始时间和结束时间。但是,我们的记录仅限于发送到控制台,这可能不是我们所需要的。我们真正需要的是能够控制从

3、函数外部记录信息的位置,同时不必使函数代码变得复杂。      在这种情况下,代理便是理想的解决方法。代理使我们可以指定将要调用的函数,看起来好像不需要指定哪个函数一样。对代理的声明类似于对函数的声明,不同的是在这种情况下,我们所声明的是此代理可引用的函数签名。      我们的例子将声明一个带有单个字符串参数且没有返回类型的代理。修改该类如下:publicclassMyClass{publicdelegatevoidLogHandler(stringmessage);publicvoidProces

4、s(LogHandlerlogHandler){if(logHandler!=null)logHandler(“Process()begin”);//这里还有其他东西if(logHandler!=null)logHandler(“Process()end”);}}      使用代理与直接调用函数相似。只是在调用函数前,我们需要检查代理是否为空(即不指向一个函数)。      要调用Process()函数,我们需要声明一个与代理相匹配的记录函数,然后创建代理的实例,以指向该函数。然后,将此代理传递给P

5、rocess()函数。classTest{staticvoidLogger(strings){Console.WriteLine(s);}publicstaticvoidMain(){MyClassmyClass=newMyClass();MyClass.LogHandlerlh=newMyClass.LogHandler(Logger);myClass.Process(lh);}}      Logger()函数是一个我们要从Process()函数中调用的函数,我们对它进行了声明,使其与代理相匹配。

6、在Main()中,我们创建代理的一个实例,然后将该函数传递给代理构造函数,使其指向该函数。最后,我们将代理传递给Process()函数,该函数接着调用Logger()函数。      如果您习惯于使用C++语言,您可能会认为代理很像函数指针,这种想法非常接近于事实。但是,代理并不“仅仅”是函数指针,它还提供了其它多种功能。文章出处【狗刨学习网】传递状态(PassingState)      在上面的简单示例中,Logger()函数仅仅是输出些字符串。一个不同的函数可能把信息记录到文件中,但是要进行这种

7、操作,该函数需要知道把信息写道什么文件中。      对于Win32®而言,当您传递函数指针时,可随之传递状态。但是对于C#,这就没有必要了,因为代理既可指向静态函数,“也”可指向成员函数。以下是一个有关如何指向成员函数的示例:classFileLogger{FileStreamfileStream;StreamWriterstreamWriter;publicFileLogger(stringfilename){fileStream=newFileStream(filename,FileMode.C

8、reate);streamWriter=newStreamWriter(fileStream);}publicvoidLogger(strings){streamWriter.WriteLine(s);}publicvoidClose(){streamWriter.Close();fileStream.Close();}}classTest{publicstaticvoidMain(){FileLoggerfl=newFileLogger(“proces

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。