У меня есть класс, который я должен вызывать один или два метода много раз друг за другом. В настоящее время методы возвращают void
. Я думал, было бы лучше, если бы он вернулся this
, чтобы методы могли быть вложенными? или это очень важно? или если это плохо, было бы лучше, если бы он вернул новый объект того же типа? Или что вы думаете? В качестве примера я создал три версии класса сумматора:
// Regular
class Adder
{
public Adder() { Number = 0; }
public int Number { get; private set; }
public void Add(int i) { Number += i; }
public void Remove(int i) { Number -= i; }
}
// Returning this
class Adder
{
public Adder() { Number = 0; }
public int Number { get; private set; }
public Adder Add(int i) { Number += i; return this; }
public Adder Remove(int i) { Number -= i; return this; }
}
// Returning new
class Adder
{
public Adder() : this(0) { }
private Adder(int i) { Number = i; }
public int Number { get; private set; }
public Adder Add(int i) { return new Adder(Number + i); }
public Adder Remove(int i) { return new Adder(Number - i); }
}
Первый может быть использован следующим образом:
var a = new Adder();
a.Add(4);
a.Remove(1);
a.Add(7);
a.Remove(3);
Другие два могут быть использованы следующим образом:
var a = new Adder()
.Add(4)
.Remove(1)
.Add(7)
.Remove(3);
Если единственное отличие состоит в том, что a
в первом случае это new Adder()
, а во втором - результат последнего метода.
Первое, что я нахожу, быстро становится... раздражающим писать снова и снова. Поэтому я хотел бы использовать одну из других версий.
Третий работает подобно многим другим методам, таким как многие методы String и IEnumerable методы расширения. Я полагаю, что у нее есть положительная сторона в том, что вы можете делать такие вещи, как var a = new Adder(); var b = a.Add(5);
, а затем иметь один, который был 0, и тот, который был 5. Но в то же время не так ли дорого создавать новые объекты все время? И когда первый объект умрет? Когда первый метод возвращает вид? Или?
В любом случае мне нравится тот, который возвращает this
, и думаю, что я буду использовать это, но мне очень любопытно узнать, что другие думают об этом случае. И то, что считается лучшей практикой.