In .Net können Sie Methoden verketten, die einen Wert zurückgeben oder eine Leere verwenden. Ist einer von beiden der "richtige Weg"?
Man könnte also sagen
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;
}
In diesem Fall müssen alle 3 Erweiterungsmethoden IList (der Typ für myFoo.Bars) zurückgeben
oder es könnte auch geschrieben werden als
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
}
in diesem Fall geben die Erweiterungsmethoden einen leeren Wert zurück, bearbeiten aber das Quellobjekt, das hereinkommt?
UPDATE Simon hatte Recht mit seiner Antwort, dass 2) nicht kompilierbar ist. Hier ist, wie das umgeschrieben werden könnte:
DoSomethingCool(myBars)
.DoSomethingElse(myBars)
.AndSomethingElse(myBars);
myBars würde sich dann innerhalb des Aufrufs jeder Methode ändern und die Methoden würden ungültig zurückkehren.