All those answers are good, but I'd like to add a note on constructors with a little more complex initializations.
class SomeClass {
private int StringLength;
SomeClass(string x) {
// this is the logic that shall be executed for all constructors.
// you dont want to duplicate it.
StringLength = x.Length;
}
SomeClass(int a, int b): this(TransformToString(a, b)) {
}
private static string TransformToString(int a, int b) {
var c = a + b;
return $"{a} + {b} = {c}";
}
}
Allthogh this example might as well be solved without this static function, the static function allows for more complex logic, or even calling methods from somewhere else.