链接的方法

本文关键字:方法 链接 | 更新日期: 2023-09-27 18:14:02

很久以前,我看到一些东西允许您动态地将一系列方法链接在一起。不记得是用c#还是c++写的

它是这样的:

方法:

Foo();
Bar();
Moar();
然后创建一个对象,该对象订阅(由于没有更好的词)上述任何或所有方法(取决于程序员的规范),并且传递给该对象的任何内容都将运行所有订阅的方法。

我问,因为我正在一个程序的内核上工作,这取决于各种各样的选择,可能需要也可能不需要某些方法。因为这个程序需要非常紧凑的编码(我不喜欢在if/else语句上浪费处理器周期…它将加起来),我想知道是否有人记得我试图传达的内容,以及c#等效的内容是什么。

谢谢,- r

链接的方法

听起来像一个事件:

宣称:

public event Action Something;
订阅:

obj.Something += x.Foo;
...
obj.Something += y.Bar;
...
obj.Something += z.Moar;

然后调用:

protected virtual void OnSomething() {
    var handler = Something;
    if(handler != null) handler();
}
...
OnSomething(); // call ^^^^^^

将调用所有3个方法,但使用松耦合。

注意,您可以使用委托而不是事件来完成完全相同的操作。还要注意,事件通常具有更具体的void (object sender, SomeEventArgs args)签名(但这是惯例,不是要求)。

Marc的答案是c#中最接近的,但值得指出的是-这不会比一系列if更快,它会更慢。

也许你指的是在一种方法结束时,你可以将JMP转移到汇编器中的另一个地址,以避免CALL和两个随后的RET s -这是X86汇编器,但现代优化编译器将为你进行优化。

。你用CALL调用一个方法,它把返回地址推到堆栈,然后在另一个方法的末尾,你可能会CALL另一个,但然后它完成,做一个RET回到第一个的末尾,做一个RET跳回原来的调用者。然而,在第一个方法的末尾有一个JMP,它"链"到第二个方法,第二个方法的RET返回给调用者,节省了额外的跳转/一些堆栈操作。


根据你想做的事情,你可以使用框架的Reflection Emit部分(http://msdn.microsoft.com/en-us/library/3y322t50.aspx)在。net中动态生成代码。如果你想以文本方式编译方法,你也可以使用内置的c#编译器动态地将方法编译到内存中。这个可能就是你在想的

您是否还记得在某些api中发现的一些"流畅"编码风格的片段?

每个函数返回其对象实例作为函数结果,因此可以像这样将调用链接在一起:

obj.Foo()
 .Bar()
 .Moar();

这里没有特别神奇的性能提升,它只是让您不必一次又一次地键入对象实例变量名。

好吧,使用函数结果作为下一次调用的实例参数可能会获得很小的效率。如果函数结果在寄存器EAX中返回,并且下一次调用的实例指针在寄存器EAX中传递,那么这种流畅的调用模式将保存一个或两个指令,以便将实例指针加载到下一次调用的EAX寄存器中。但是就性能调优而言,这是非常非常小的。

您可以使用delegate来解决它