Is it better to initialize class member variables on declaration
private List<Thing> _things = new List<Thing>();
private int _arb = 99;
or in the default constructor?
private List<Thing> _things;
private int _arb;
public TheClass()
{
_things = new List<Thing>();
_arb = 99;
}
Is it simply a matter of style or are there performance trade-offs, one way or the other?
In terms of performance, there is no real difference; field initializers are implemented as constructor logic. The only difference is that field initializers happen before any "base"/"this" constructor.
The constructor approach can be used with auto-implemented properties (field initializers cannot) - i.e.
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
Other than that, I tend to prefer the field initializer syntax; I find it keeps things localized - i.e.
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
I don't have to go hunting up and down to find where it is assigned...
The obvious exception is where you need to perform complex logic or deal with constructor parameters - in which case constructor-based initialization is the way to go. Likewise, if you have multiple constructors, it would be preferable for the fields to always get set the same way - so you might have ctors like:
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
edit: as a side comment, note that in the above, if there are other fields (not shown) with field initializers, then they are only directly initialized in the constructors that call base(...)
- i.e. the public Bar(string foo)
ctor. The other constructor does not run field initializers, since it knows they are done by the this(...)
ctor.