The object initializer syntax introduced in C# makes it easy to work with "configuration" type objects.
public class TemperatureSetting { public float Value { get; set; } public float Variance { get; set; } public float Threshold { get; set; } } // ... var settings = new TemperatureSetting { Value = 104f, Variance = 0.6f, Threshold = 1.2f };
The code is easy to read, but, it becomes a bit trickier if you want some additional features from the class.
and
There are a few ways to solve the problem. One approach is to hide the property setters and provide a non-default constructor.
public class TemperatureSetting { public TemperatureSetting(float value, float variance, float threshold) { //... } public float Value { get; private set; } public float Variance { get; private set; } public float Threshold { get; private set; } }
However, this approach makes construction difficult to read, unless you define variables for each value to give them a name.
var settings = new TemperatureSetting(104f, 0.6f, 1.2f); // or var value = 104f; var variance = 0.6f; var threshhold = 1.2f; var settings = new TemperatureSetting(value, variance, threshhold);
Fortunately, C# 4.0 gives us named arguments - it's the best of both worlds.
var settings = new TemperatureSetting( value: 104f, variance: 0.6f, threshold: 1.2f );
All this code needs is an extra { and } and we can put a .js extension on the file …