我们这里将讨论一下这个另类的思维,那就是如果一个语言(平台)把事件视为对象,则表明它把“事件”作为了语言的一等公民来对待。这会不会产生错误?

将事情视为目标,有的时分便是把事情的等级进行了进步,这样就能有效地进步言语的笼统才能。有的时分会呈现过错,但仍是值得测验的。

特殊的思想 将事情视为目标(所有的思想和行为都以实现目标为依据)  对象 第1张

假如一个言语(渠道)把事情视为目标,则标明它把“事情”作为了言语的一等公民来对待。这意味着,咱们能够把一个独自的事情作为参数传递给办法,也能够将其作为一个目标的一部分,这有效地进步言语的笼统才能。试想,假如没有“托付”,在.NET中就无法把“办法”看作是目标,也就很难运用现在各种灵敏的笼统办法。相同,因为.NET自身无法将事情作为单个目标处理,因而在某些时分就会束手束脚,也难以引进一些特别的编程模型。

这便是“把事情作为目标进行传递”的实践意义。

在上一篇文章里,咱们提出了一种“解决方案”,它答应咱们编写这样的代码:

  1. classProgram
  2. {
  3. publiceventEventHandlerSubmit;
  4. staticvoidMain(string[]args)
  5. {
  6. Programp=newProgram();
  7. varev=EventFactory.Create(()=>p.Submit);
  8. ev+=(sender,eventArgs)=>Console.WriteLine(sender);
  9. p.Submit("HelloWorld",EventArgs.Empty);
  10. Console.WriteLine("Pressanykeytoexit...");
  11. Console.ReadLine();
  12. }
  13. }

看上去挺那么像回事儿的,运用办法和传统的事情好像没有太大差异。可是文末我说到这儿其实有些“欺骗”的意味,而咱们的安装脑袋同学、以及“脑袋安装得不输给安装脑袋”的RednaxelaFX,这两位纯爷们也都指出了问题。

信脑袋,得永生。信RednaxelaFX,原地满状况复生。

以上代码的“忽悠”,在于操作Program.Submit的代码处于Program类之内。假如咱们想要运用相同的做法操作其他类的事情就做不到了,例如:

  1. publicclassMyClass
  2. {
  3. publiceventEventHandlerMyEvent;
  4. }
  5. classProgram
  6. {
  7. staticvoidMain(string[]args)
  8. {
  9. varmyClass=newMyClass();
  10. varev=EventFactory.Create(()=>myClass.MyEvent);
  11. }
  12. }

这样的代码看似没有问题,可是编译器会提示这样的过错:

The event 'SimpleConsole.MyClass.MyEvent' can only appear on the left hand side of += or -= (except when used from within the type 'SimpleConsole.MyClass')

编译器告知咱们,除了在MyClass类的内部,MyEvent事情只能呈现在+=或-=操作的左面。之前说到的两位纯爷们在前文的谈论中也有过相关及衍生的谈论。因而,咱们现在的做法是失利的。

前文的谈论中还有朋友说到,咱们事实上也能够把一个事情作为参数传递给一个办法(然后在办法里增加或删去处理程序),只需运用ref关键字就能够了,例如:

  1. staticvoidRegisterHandlers(refEventHandlere){...}

然后:

  1. staticvoidMain(string[]args)
  2. {
  3. varmyClass=newMyClass();
  4. RegisterHandlers(refmyClass.MyEvent);
  5. }

不过很显然,这样的做法也会遇到相同的问题:除非是Program内部的事情,咱们不能把它像一个托付目标那样传递。并且,即便能够传递,咱们也只能为它增加或删去处理函数,而不能把它作为另一个目标的一部分,然后通过各种处理之后,还能够对这个事情进行操作。

因而,咱们要完成的其实是这样一个类型:

  1. publicclassDelegateEvent
  2. {
  3. ...
  4. publicDelegateEventAddHandler(TDelegatehandler){...}
  5. publicDelegateEventRemoveHandler(TDelegatehandler){...}
  6. } 

这便是今日“兴趣编程”的标题:将DelegateEvent<>类型完成完好,并尽可能做到谨慎和易用(即适用于各种场合,各种办法进行“结构”)。

所谓“兴趣编程”,是指那些我觉得难度适中的小标题,并能够训练“编程才能”或“言语类库的把握程度”。一般来说它们都源自实践项目,只不过改形成“标题”时进行了“笼统”和“提炼”。个人认为它们仍是挺合适作为平常的编程操练来运用的,感兴趣的朋友们不妨一试。

至于标题是否真的有“兴趣”……这个见仁见智吧。我想,要让那些关于那些视编程如苦难的朋友们感到风趣,应该不比登天要简略一些。

原文标题:兴趣编程:将事情视为目标

链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/09/more-on-event-as-object.html

【修改引荐】

  1. C#线程同步详细分析
  2. C#讨论木马程序浅谈
  3. C# Pop3Connection类简介
  4. C#数据类型简略介绍
  5. C#核算素数序列浅谈

转载请说明出处
知优网 » 特殊的思想 将事情视为目标(所有的思想和行为都以实现目标为依据)

发表评论

您需要后才能发表评论