【发布时间】:2014-06-22 03:38:02
【问题描述】:
我有一个名为 Vector 的类,我正在对它实现乘法运算符,这是我的实现:
public static Object operator *(Vector x, Vector y)
{
//Possible return objects
Matrix multiplicationResultMatrix;
float multiplicationResultScalar = 0f;
if (x.VectorType != y.VectorType)
{
if (x.Length == y.Length)
{
if ((x.VectorType == VectorType.Row) && (y.VectorType == VectorType.Column))
{
for (ulong i = 0; i < x.Length; i++)
{
multiplicationResultScalar += x[i] * y[i];
}
}
else
{
if ((x.VectorType == VectorType.Column) && (y.VectorType == VectorType.Row))
{
multiplicationResultMatrix = new Matrix(x.Length);
for (ulong j = 0; j < x.Length; j++)
{
for (ulong i = 0; i < x.Length; i++)
{
multiplicationResultMatrix[i, j] += x[i] * y[j];
}
}
}
}
}
else
{
throw new ArithmeticException("Unhandled Arithmetic Exception, Multiplication of two vectors of different length is not allowed");
}
}
else
{
throw new ArithmeticException("Unhandled Arithmetic Exception, Multiplicating vectors of the same type is not allowed");
}
//What should I return
return ?
}
我应该如何定义返回类型?我曾想过将它们装箱,并在食用时拆箱,但我认为这不是一个好的安全解决方案。
更新:
我也考虑过只返回一个矩阵对象,因为标量是一个 1x1 矩阵,问题是矩阵类有一些复杂的方法和属性,这些方法和属性在 1x1 的情况下不能正常工作(这将强迫我添加一些代码),加上我想最小化和优化计算,我正在处理数百万范围内的矩阵乘法。
【问题讨论】:
-
对于这段代码,您应该将返回类型定义为
Matrix,并完全忘记标量结果分支。调用者可以检查结果(无论您选择什么,它都必须这样做),看到它是 1x1 并提取标量值。 -
这个问题似乎离题了,因为它可能属于代码审查。
-
@Jon : 检查我的更新
-
我在这里进行猜测,但是:1) 如果
Matrix类不能与 1x1 矩阵一起正常工作,那么只需将该类至少有一个应该修复的错误,时期。说您必须添加代码也是一种危险信号,因为通常正是“附加”代码导致了这些问题,解决方案是删除它。 2)“最小化和优化计算”太笼统而没有用处。 -
@Jon : 谢谢你的解释,我会听取你的建议
标签: c# .net methods return boxing