.NET事件特殊方法(add / remove / raise / other) [英] .NET events special methods (add/remove/raise/other)

查看:707
本文介绍了.NET事件特殊方法(add / remove / raise / other)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道 EventInfo.GetRaiseMethod EventInfo.GetOtherMethods 方法。显然,CLR支持与事件相关的4种方法:添加,删除,加注和其他。但是在C#中创建的事件只有添加删除 ...我假定在VB中使用了 raise ,因为你必须指定一个 RaiseEvent 方法,当您声明一个自定义事件,但显然不是这样的: GetRaiseMethod 总是返回null。

I was wondering about the EventInfo.GetRaiseMethod and EventInfo.GetOtherMethods methods. Apparently, the CLR supports 4 kinds of methods associated with events: add, remove, raise, and "others". But events created in C# only have add and remove... I assumed that raise was used in VB, since you have to specify a RaiseEvent method when you declare a custom event, but apparently it's not the case: GetRaiseMethod always returns null.

所以,有没有人知道:


  • 提高 / em>与事件关联的方法,如果它从未使用过?有没有特定的MSIL指令来使用这种方法来引发事件? (我没有在操作系统中找到任何东西)

  • 实际上返回的其他方法是什么(实际上,不是)由 GetOtherMethods ?他们应该做什么?

  • BCL中是否有实现这些特殊方法的类型?

  • what's the point in having a raise method associated with an event if it's never used? Is there a specific MSIL instruction to raise an event using this method? (I couln't find anything like it in the opcodes)
  • what are the "other" methods returned (well, not returned actually) by GetOtherMethods? What's are they supposed to do?
  • are there types in the BCL that implement those special methods?

推荐答案

据我所知,加注并没有多少用,实际上从来没有见过它。 C ++ / CLI几乎是我知道的唯一可以很容易地声明raise方法的语言。请参阅此代码,例如:

As far as I know, raise isn't used much, and I've practically never seen it used. C++/CLI is pretty much the only language I know that make it easy to declare a raise method. See this code for example:

using namespace System;

ref class Foo {

private:
    Action ^bar;

public:
    event Action ^Bar {
        void add (Action ^action)
        {
            Console::WriteLine ("add");
            bar += action;
        }

        void remove (Action ^action)
        {
            Console::WriteLine ("remove");
            bar -= action;
        }

        void raise ()
        {
            Console::WriteLine ("raise");

            if (!bar)
                return;

            Console::WriteLine ("raise for real");
            bar->Invoke ();
        }
    };
};

void hello ()
{
    Console::WriteLine ("hello");
}

void main ()
{
    Foo ^foo = gcnew Foo ();
    foo->Bar ();

    foo->Bar += gcnew Action (&hello);

    foo->Bar ();
}

哪些在运行时自然输出:

Which, when being run, naturally outputs:

C:\tmp>test
raise
add
raise
raise for real
hello

为了回答你的问题,没有调用事件的操作码,编译器只会发出一个电话加注方法:

To answer your question, there's no opcode to invoke an event, the compiler will just emit a call to the raise method:

  IL_0020:  ldloc.0
  IL_0021:  call       instance void Foo::raise_Bar()

就像它发出对add_Bar的调用一样。

Just like it emits a call to add_Bar.

它也不值得,因为C#允许您在声明成员事件的类型的范围内调用一个事件,您不能获得调用该raise方法的C#代码。所以不,你不会在BCL中找到这样的方法。

It's also worth nothing that as C# allows you to invoke an event exclusively in the scope of the type which declares the member event, you can't get C# code to call that raise method. So no, you won't find such a method exposed in the BCL.

至于 .other kind的方法,我从来没有看到任何附加的事件。而且我只是看到他们使用一次属性,而且这本书内部IL汇编器或CLI注释标准提供有关它们的任何信息。但是基本上,它们允许你将方法附加到一个属性或一个事件上,以便在语义上绑定它们。他们既不是 addon ,也不是 removeon ,也不是 raise 方法,但如果一个语言需要表达,它们将成为事件的一部分。在此期间,唯一的排放方法是使用ilasm。

As for the .other kind of methods, I've never seen any attached to an event. And I only saw them used once for properties, and neither the book «Inside IL assembler» nor «The CLI annotated standard» give any information about them. But basically, they allow you to attach methods to a property or to a event to bind them semantically. They're neither a addon, nor a removeon, nor a raise method, but they would be part of the event, should a language need to express that. In the meantime, the only way to emit one is to use ilasm.

这篇关于.NET事件特殊方法(add / remove / raise / other)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆