public sealed class QuadraticEquation : IRoots
{
public double A { get; }
public double B { get; }
public double C { get; }
public bool HasRoots { get { return discr >= 0; } }
private readonly static double[] emptyResult = {double.NaN, double.NaN};
private double[] calculatedResult = null;
private double discr, doubleA;
private readonly object syncLock = new object();
private QuadraticEquation() { }
public QuadraticEquation(double a, double b, double c) : this()
{
if( a==0 ) {
throw new ArgumentOutOfRangeException("If A=0, the equation is not quadratic!");
}
A = a;
B = b;
C = c;
discr = B*B - 4*A*C;
doubleA = 2*A;
}
public double[] GetRoots()
{
if (! HasRoots ){
return emptyResult;
} else {
return CalculateResult();
}
}
private double[] CalculateResult(){
lock(syncLock) {
if( calculatedResult == null){
var sqrt = Math.Sqrt(discr);
calculatedResult = new double[2]
{
(-B + sqrt) / doubleA,
(-B - sqrt) / doubleA
};
}
}
return calculatedResult;
}
}
На самом деле, так вообще не нужо писать. Или явная статическая инициализация, или член класса, скорее всего, вообще не нужен... автоматически исходил из того, что там пустая строка :) Но для этого странного примера ничего другого в голову не пришло.