6

在 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)?如果我继续链接调用,我最终会溢出吗?在这种情况下,采取客观路线是否被认为更明智(以“不必要的”内存分配为代价?)。

4

2 回答 2

2

这与您在单独的行中调用每个方法完全相同,每次将返回值分配给一个变量,然后使用该变量调用下一个方法。

所以你的两个样本是相同的,有效的。

你有反光板吗?您可以尝试这两种方法并检查生成的 IL 代码以确切了解存在哪些差异。

于 2013-04-02T10:03:02.547 回答
0

虽然这 2 个调用是相同的,但如果你有很多“点”,那么在某处它就是代码异味(得墨忒耳定律)。

见下面的讨论

于 2013-04-02T10:13:20.207 回答