c#:顺序函数调用是如何工作的?(efficiency-wise)
本文关键字:工作 efficiency-wise 何工作 顺序 函数调用 | 更新日期: 2023-09-27 18:06:54
在c#中,通常以相当客观的方式编写,如:
MyObj obj = new MyObj();
MyReturn ret = obj.DoSomething();
AnotherReturn rett = ret.DoSomethingElse();
我可以这样写:
AnotherReturn rett = new MyObj().DoSomething().DoSomethingElse();
然而,当你在这样的序列中有一堆函数调用时,stackframe是如何工作的?这个例子相当简单,但想象一下,如果我有50多个函数调用链接(这可能发生在JavaScript (/w jQuery))。
我的假设是,对于每个函数调用,都有一个返回地址(到"点"?),然后返回值(具有其他方法的新对象)立即被泵入该返回地址的下一个函数调用。除了获得总体返回值(在本例中,返回地址将把最终函数值赋给rett)之外,这是如何工作的?如果我继续链接调用,最终会溢出吗?在这种情况下,采取客观路线(以"不必要的"内存分配为代价)是否更明智?
这与您在单独的行中调用每个方法完全相同,每次将返回值赋给一个变量,然后使用该变量调用下一个方法。
所以你的两个样本实际上是相同的。
你们有Reflector吗?您可以尝试这两种方法,并检查生成的IL代码,看看它们究竟有什么不同。
虽然这两个调用是相同的,但如果你有很多"Dots",那么在某个地方它是一个代码气味(得墨忒耳定律)。
参见下面的讨论