3

.Net では、値を返すメソッド、または void を使用してメソッドを連鎖できます。それらの1つは「正しい方法」ですか?

だからあなたは言うことができます

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 を返しますが、入ってくるソース オブジェクトに対して作業を行いますか?

UPDATEサイモンは、2)コンパイルされないという彼の答えで正しかった。これを書き直すと次のようになります。

DoSomethingCool(myBars)
.DoSomethingElse(myBars)
.AndSomethingElse(myBars);

myBars は各メソッドの呼び出し内で変更され、メソッドは void を返します。

4

2 に答える 2

0

どちらの場合も、拡張メソッドを使用してオブジェクトを返し、そのオブジェクトをチェーン内の次のメソッドへの入力として使用しています。2 番目の例はFluent Interfaceに近いものです(完全ではありません)。あなたの2つの例では、重要な違いは可変性の1つだと思います。元の入力を変更するか (2 番目の例)、変更しないか (最初の例)? 「正しい」答えは、状況と文脈によって異なります。

于 2011-07-14T02:57:45.823 に答える
0

1) 勝つ。サイモンは、2) はコンパイルできないと正しく答えましたが、彼はコメントとしてそれを行ったので、答えた功績を認めることはできません。2) の更新されたソリューションは、副作用としてすべてを行います。静的に型付けされた言語でそれを行う理由が思いつきません。

連鎖のデバッグの問題について指摘された点は考慮すべき点ですが、連鎖はフィルタリングの際に特に役立つことがわかりました。

mybars.FilterByHasHappyHour()よりもはるかにいいです

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