C#方法链可以“太长”吗?

自然而然,由于您可以随时将单独的方法排列成单独的行,而不是在可读性方面。相反,由于任何原因,将过多的方法链接在一起是否是危险的?我主要使用方法链来声明单个一次性使用的变量来节省空间,传统上使用返回方法代替修改调用者的方法。除了字符串方法,我无情地链接了链。无论如何,我有时担心使用非常长的方法链在一行中的影响。

假设我需要根据某人的用户名更新一个项目的值。不幸的是,检索正确用户的最短方法如下所示。

SPWeb web = GetWorkflowWeb();
SPList list2 = web.Lists["Wars"];
SPListItem item2 = list2.GetItemById(3);
SPListItem item3 = item2.GetItemFromLookup("Armies", "Allied Army");
SPUser user2 = item2.GetSPUser("Commander");
SPUser user3 = user2.GetAssociate("Spouse");
string username2 = user3.Name;
item1["Contact"] = username2;

一个2或3个持续时间只有一个电话,所以我可以把它缩减为以下(这也让我摆脱了一个多余的1):

SPWeb web = GetWorkflowWeb();
item["Contact"] = web.Lists["Armies"]
                     .GetItemById(3)
                     .GetItemFromLookup("Armies", "Allied Army")
                     .GetSPUser("Commander")
                     .GetAssociate("Spouse")
                     .Name;

诚然,当它全部在一行,并且当你有int.Parse(ddlArmy.SelectedValue.CutBefore(“;#”,false))而不是3时,它看起来更长了。然而,这是平均长度之一这些链,我可以很容易地预见到一些特别长的计数。排除可读性,有没有什么我应该担心这10个方法链?或者使用真正长的方法链没有损害?

方法链可以有多长时间没有技术限制。

然而,可能会出现问题的三个方面是调试,异常处理和资源处理。

同样的事实,调试变得复杂,使得链接如此优雅 – 缺乏中间临时变量。不幸的是,没有临时变量,调试时检查中间结果变得很痛苦。

异常处理是复杂的,因为您不能将从一种方法引发的异常与另一种方法相分离。通常这不是一个问题,如果你不能做一些有意义的回应异常 – 只是让它传播到呼叫链。但是,如果您稍后意识到需要异常处理,则必须重构链接语法才能插入适当的try / catch处理程序。

类似于异常处理是确定性处置资源的情况。 C#中最简单的方法是使用() – 不幸的是,链接语法排除了这一点。如果您正在调用返回一次性对象的方法,避免链接语法可能是一个好主意,以便您可以成为一名优秀的“代码公民”,并尽可能早地处理这些资源。

方法链接语法通常在fluent APIs中使用,它允许您的代码的语法更加紧密地反映您打算的操作顺序。 LINQ是.NET中常见的流畅/链接语法的一个例子。

翻译自:https://stackoverflow.com/questions/2849193/can-a-c-sharp-method-chain-be-too-long

转载注明原文:C#方法链可以“太长”吗?