链接的方法
本文关键字:方法 链接 | 更新日期: 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
来解决它