为了教育目的,我正在研究一个简单的数学库,并且我实现了代表Rational Number的struct
。很显示结构的核心领域基本代码:Rational数字结构的默认值结构
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);
}
的问题是,这是行不通的,因为我的RationalNumber
默认值是不0/1
但0/0
这是一种特殊的值(Indeterminate form)。
显然一个解决办法很简单,它是简单地改变方法:
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
中强加任意的默认值。
编辑:错别字
编辑2:拓宽问题的范围
OK,看来是没有办法从我得到的输入强加在struct
任意默认值,从我自己的结论基础上我有限的C#知识。
有人可以给我一个线索,为什么结构必须以这种方式表现?是出于某种原因还是以这种方式实施,因为没有人想过指定选项来定义默认值?
非常恶心,但你可以将'denominator'改为'denominatorMinusOne'!所以,当'denominatorMinusOne == 0'这将意味着'分母== 1'。我觉得很难推荐这是一个好主意! – 2013-05-03 12:49:34
@DavidHeffernan也许不是'denominatorMinusOne',因为这意味着不同的范围,但也许'denominatorXorOne'?即使这不是一个好主意,它也许是唯一的想法! – Rawling 2013-05-03 12:58:04
你可以添加类似'private bool isInitialized;'并在您的方法中创造性地使用该属性。 – Arvo 2013-05-03 14:00:58