3

在 .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。

4

2 回答 2

0

在这两种情况下,您都在使用扩展方法,返回一个对象,然后将该对象用作链中下一个方法的输入。第二个例子接近于一个流畅的界面(但不完全)。我认为在你的两个例子中,关键区别是可变性之一。您希望修改原始输入(第二个示例)还是不修改(第一个示例)?“正确”的答案取决于情况和上下文。

于 2011-07-14T02:57:45.823 回答
0

1) 获胜。西蒙正确地回答了 2) 不会编译,但他是作为评论这样做的,所以我不能把他的回答归功于他。2) 的更新解决方案将所有事情都作为副作用,我想不出为什么你会想要在静态类型语言中这样做。

关于链接调试问题的观点值得考虑,尽管我发现链接在过滤时特别有用。

mybars.FilterByHasHappyHour()

BigGiantUtilityClass.GetBarsWithHappyHours(myBars)
于 2011-08-11T17:54:00.850 回答