在C#中,以相当客观的方式编写是常规的,如下所示:
MyObj obj = new MyObj();
MyReturn ret = obj.DoSomething();
AnotherReturn rett = ret.DoSomethingElse();
我可以像这样写上面的内容:
AnotherReturn rett = new MyObj().DoSomething().DoSomethingElse();
但是,当你在这样的序列中进行一堆函数调用时,堆栈框架是如何工作的?这个例子非常简单,但想象一下,如果我有50多个链接的函数调用(这可能发生在JavaScript(/ w jQuery)中)。
我的假设是,对于每个函数调用,返回地址(到“点”?)和返回值(带有其他方法的新对象)然后立即被泵入下一个函数调用返回地址。这是如何工作的w.r.t.获得整体返回值(在此示例中,返回地址将最终函数值分配给rett)?如果我一直链接电话,我最终会溢出?在这种情况下,采取客观路线(以“不必要的”记忆分配为代价)是否更为明智?)。
答案 0 :(得分:2)
与在单独的行上调用每个方法完全相同,每次都将返回值赋给变量,然后使用该变量调用下一个方法。
所以你的两个样本是有效的。
你有反射器吗?您可以尝试这两种方法并检查生成的IL代码,以确切了解它们之间的差异。
答案 1 :(得分:0)
虽然2个电话是相同的但是如果你有很多“Dots”,那么它就是代码气味(Demeter法则)。
见下文discussion