Я работаю над простой математической библиотекой для образовательных целей, и я реализовал struct
, который представляет Rational Number. Очень простой код, показывающий основные поля структуры:
public struct RationalNumber
{
private readonly long numerator;
private readonly long denominator;
private bool isDefinitelyCoprime;
private static RationalNumber zero = 0;
public RationalNumber(long numerator, long denominator)
{
this.numerator = numerator;
this.denominator = denominator;
this.isDefinitelyCoprime = false;
}
...
}
В настоящее время я реализую RationalMatrix
, который, как вы уже догадались, будет состоять из RationalNumber
типизированных элементов.
Полезной матрицей, для которой я создаю статический строитель, является матрица Identity. Код выглядит следующим образом:
public static RationalMatrix GetIdentityMatrix(int dimension)
{
RationalNumber[,] values = new RationalNumber[dimension, dimension];
for (int i = 0; i < dimension; i++)
values[i, i] = 1;
return new RationalMatrix(values);
}
Проблема заключается в том, что это не будет работать, потому что значение по умолчанию моего RationalNumber
не 0/1
, а 0/0
, которое является особым видом значения (Неопределенная форма).
Очевидно, одно решение простое, и просто нужно изменить метод:
public static RationalMatrix GetIdentityMatrix(int dimension)
{
RationalNumber[,] values = new RationalNumber[dimension, dimension];
for (int i = 0; i < dimension; i++)
for (int j = i+1 ; j < dimension; j++)
{
values[i, i] = 1;
values[i, j] = RationalNumber.Zero;
values[j, i] = RationalNumber.Zero;
}
return new RationalMatrix(values);
}
Но это как-то кажется пустой тратой усилий, поскольку я в основном инициализирую значения всего массива два раза. Я думаю, что было бы более элегантно каким-то образом сделать значение по умолчанию RationalNumber
равным 0/1
. Это было бы легко сделать, если RationalNumber был class
, но я не могу придумать способ сделать это, когда он struct
. Я пропустил что-то очевидное или нет способа избежать использования 0/0
в качестве значения по умолчанию?
Я хотел бы отметить, что меня вообще не интересует производительность кода (если это будет моим узким местом, то я уже далеко не смогу достичь своих целей). Мне просто интересно узнать, есть ли какая-нибудь конструкция (неизвестная мне), которая позволяет вам вводить произвольные значения по умолчанию в struct
.
EDIT: Typos
РЕДАКТИРОВАТЬ 2: Расширить круг вопросов
ОК, похоже, что невозможно ввести произвольные значения по умолчанию в struct
из ввода, который я получаю, и из моих собственных выводов, основанных на моих ограниченных знаниях на С#.
Может кто-нибудь дать мне понять, почему структуры должны вести себя таким образом? Это по какой-то причине или было реализовано таким образом, потому что никто не думал указать параметр для определения значений по умолчанию?