Should I use set once variables?

c#

Solution

Set-once-properties violate the principle of least surprise - a caller expects that when a property can be set once, it can be set again. (barring range and compatibility checks, of course - but they are bound to specific values or value combinations).

Initialize them in the constructor. Alternatively, if they are to many / to complex to write all constructors, use a factory/builder class:

ThingieBuilder tb = new ThingieBuilder();
tb.FooThingy = 17.23;   // r/w properties
tb.BarThingy = 42;
tb.UseExtendedThingamagicAdapter = true;
Thingie t = tb.Create();
if (t.Bar==42) // r/o property
  ...

Or, separate the settings in a configuration object, that can be replaced or passed during construction.

Problem

Does this smell? I have a few properties you can only set once. They can be set at any time during the objects existence and can not be undone. I implement then like this. ``` private FooThingy _foo; public FooThingy Foo { set { if (null == _foo) _foo = value; } get { return _foo; } } ``` But I don't like it. I feel like I have missed something. Have I? Edit: Why I don't have it in the constructor. I cant go into the details but setting this results in `<`bad analogy`>` Melting the wax statue `<`/bad analogy`>`. And I don't want my constructor to create already melted objects.

Original source