返回首页

匿名委托
。虽然匿名委托已成为程序员间的世俗的东西,还有左未开发的这个微妙的东西。好吧,让我们尝试回答Senthil的问题之前,他在他的下一个职位的神秘面纱揭开。
委托是确定的目标。我们的目标是要执行的方法委托调用和其相关的实例或类型。如果目标是一个实例方法,委托保留目标方法的指针和对象的实例。如果目标是一个静态方法,委托保留目标方法的指针和它所属的类型。因此,当一个像下面这样的事件注册方法(或多路广播委托)的代码被执行,委托对象与嵌入式目标信息(这里的EventHandler)创建并添加到事件的调用列表(或组播委托,这里的keyPressed)。

class SomeForm

{

   private Control control = new Control();



   public void OnFormLoad(object sender, EventArgs args)

   {

      control.KeyPressed += new EventHandler(OnKeyPressed);

   }



   // Rest of the code omitted to be succinct

};

同样,注销的方法处理时,一个新(的EventHandler)委托对象的创建与上述相同的目标信息。正如前面所说的,委托确定的目标。换句话说,等于委托覆盖使用比较两个委托对象目标信息。因此,在下面的代码,注销的方法处理,委托实例调用列表中搜索与指定的目标的信息(方法:OnKeyPressed,实例:SomeForm实例)。
在匿名委托的情况下,编译器转换成一个内联方法的代码:静态方法,内联方法的代码,如果不使用任何类的实例成员或局部变量,或者如果它仅使用类的静态成员。实例方法,如果内联方法的代码使用至少一个类的成员,任何或没有静态成员,并没有局部变量。类方法表示内联方法的代码,如果内联方法的代码,无论是使用类的成员或不使用局部变量。
那些可能不被广泛的规则设置,但肯定是我们的讨论不够。鉴于以下的可疑代码:{C}
我们意识到,毫无疑问,将运到一个编译器生成的匿名类,匿名委托(IfEnabledThenDo返回)。后来IfEnabledThenDo注册\注销的方法处理时,匿名类的一个实例是创建和返回(EventHandler的)委托。在这里,在于精妙之处。虽然从IfEnabledThenDo委托目标内部匿名类的方法,作为一个目标信息的一部分保存的实例是在登记和未登记的不同。换言之,在该委托的目标方法返回IfEnabledThenDo属于匿名类的不同实例。因此,漂亮的代码注销(键)的方法处理程序实际上不会注销,因为会有以前在注销行使用一个相同的目标实例(的keyPressed)事件的调用列表注册的委托代码。很微妙的!
手工编写的代码通常会保持在同一类的方法处理程序的注册和注销等属于各自的实例。所以当你喜欢看编译器魔法。
让我们拭目以待什么{A1}说。{S0}

回答

评论会员:c 时间:2