欢迎来到天天文库
浏览记录
ID:39891030
大小:40.00 KB
页数:8页
时间:2019-07-14
《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
此文档下载收益归作者所有