c# - How can I share constructor code with readonly class members? -
i have class, foobarset single "core" chunk of initialization logic.
a foobar made of foo , bar. class foobarset initialized list of foobar. foobarset can also initialized separate parallel foo , bar lists.
ideally, run this:
public class foobarset { private readonly list<foobar> _list; // primary constructor. public foobarset(list<foobar> foobarlist) { // contracts , initialization... _list = foobarlist; } // secondary constructor. public foobarset(list<foo> foolist, list<bar> barlist) { // zip new list of new foobars var zipped = foolist.zip(barlist, (foo, bar) => new foobar(foo, bar)); // call primary constructor zipped list. this(zipped); } } this c#, not java, this(zipped) illegal. common solution, as in answer, pull core initialization common private method:
public class foobarset { private readonly list<foobar> _list; // common "constructor" called actual constructors. private init(list<foobar> foobarlist) { // contracts , initialization... _list = foobarlist; } public foobarset(list<foobar> foobarlist) { init(foobarlist); } public foobarset(list<foo> foolist, list<bar> barlist) { var zipped = foolist.zip(barlist, (foo, bar) => new foobar(foo, bar)); init(zipped); } } however, doesn't work either, because of readonly _list field.
assuming _list must readonly, how can these constructors share initialization code?
the simple answer init method return value set in constructor:
public class foobarset { private readonly list<foobar> _list; // common "constructor" called actual constructors. private list<foobar> init(list<foobar> foobarlist) { // contracts , initialization... return whateverlist; } public foobarset(list<foobar> foobarlist) { _list = init(foobarlist); } public foobarset(list<foo> foolist, list<bar> barlist) { var zipped = foolist.zip(barlist, (foo, bar) => new foobar(foo, bar)); _list = init(zipped); } }
Comments
Post a Comment