【发布时间】:2011-07-14 01:30:00
【问题描述】:
在 .Net 中,您可以链接返回值的方法或使用 void。其中之一是“正确的方式”吗?
所以你可以说
1)
Foo myFoo = new Foo();
myfoo.Bars =
myBars.DoSomethingCool(x)
.DoSomethingElse(y)
.AndSomethingElse(z);
public static IList<IBar> DoSomethingCool(this IList<IBar> source, object x)
{
IList<IBar> result = //some fn(source)
return result;
}
在这种情况下,所有 3 个扩展方法都需要返回 IList(myFoo.Bars 的类型)
也可以写成
2)
myBars.DoSomethingCool(x)
.DoSomethingElse(y)
.AndSomethingElse(z);
public static void DoSomethingCool(this IList<IBar> source, object x)
{
//Modify source
source = //some fn(source)
//Don't return anything
}
在这种情况下,扩展方法返回一个 void,但对传入的源对象执行工作?
更新 Simon 的回答是正确的,即 2) 不会编译。以下是可以重写的方法:
DoSomethingCool(myBars)
.DoSomethingElse(myBars)
.AndSomethingElse(myBars);
myBars 然后会在每个方法的调用中发生变化,并且这些方法将返回 void。
【问题讨论】:
-
链接方法使代码更难调试、修改和维护。
-
我不确定我是否理解它如何使调试、修改和维护变得更加困难。如果将链接放在单独的行上,则可以在任何语句处设置断点。链接使表达意图更容易,在我看来,这使维护更容易,而不是更难。
-
您的第二个示例无法编译。在 DoSomethingCool 的返回结果上调用 DoSomethingElse(),这是一个 void。
-
链接很糟糕,因为您不能单步执行每个逻辑代码行……要么全有,要么全无。您不能在步骤上设置断点。如果一个步骤失败,你不知道它是哪一步。将所有代码放在一行中会使眼睛更难以解析单独的步骤。为了说明,将程序中的每一步都放在一行上。你喜欢它吗?将每个逻辑步骤放在一行上会好得多。
-
西蒙,你是对的。我必须返回一个类型,否则我只能将结果链接一次。
标签: .net extension-methods method-chaining