我正在开发一个用于教育目的的简单数学库,并且我已经实现了一个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
类型化元素组成。
我正在为其创建静态构建器的有用矩阵是身份矩阵。代码如下:
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);
}
问题是这不起作用,因为 my 的默认值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
equal会更优雅0/1
。如果 RationalNumber 是 a ,这将很容易做到class
,但是当它是 a 时,我想不出办法来做到这一点struct
。我是否遗漏了一些明显的东西,或者没有办法避免将其 0/0
作为我的默认值?
我想指出我根本不关心代码性能(如果这是我的瓶颈,那么我已经远远超出了我的目标)。我只是想知道是否有一些构造(我不知道)允许您在struct
.
编辑:错别字
编辑2:扩大问题范围
好的,似乎没有办法struct
根据我有限的 C# 知识从我得到的输入和我自己的结论中强加任意默认值。
有人可以告诉我为什么结构必须以这种方式运行吗?是出于某种原因,还是因为没有人想到指定选项来定义默认值而以这种方式实现?