我们有一个名为
Vector3D
的结构体,对于某些方法,我们希望(默认)零向量作为默认参数,但对于其他方法,我们想要一个不同的非默认向量(例如,x 方向的单位向量)作为默认参数.
public struct Vector3D
{
public double X;
public double Y;
public double Z;
public Vector3D(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public static Vector3D UnitX()
{
return new Vector3D(1, 0, 0)
}
}
现在,可以像这样轻松实现以零向量作为默认参数的方法:
public void MyVectorMethod(Vector3D vec = new Vector3D())
{ ... }
但是,如果我们想要不同的默认参数(例如,x 方向的单位向量),则以下内容不起作用,因为默认参数必须是编译时常量:
public void MyVectorMethod(Vector3D vec = Vector3D.UnitX())
{ ... }
我们想出的一种方法是使用可为空的
Vector3D
,例如:
public void MyVectorMethod(Vector3D? vec = null)
{
Vector3D actualVec;
if (vec == null) actualVec = Vector3D.UnitX();
else actualVec = (Vector3D) vec;
...
}
这相当于 x 方向的单位向量作为默认参数。但代码不是很优雅,我们必须添加额外的类型转换。
是否有更好的(即更优雅且无需演员)的方法来实现相同的目标?
编辑: 正如 Matthew 所建议的,一个巧妙的方法是使用带有空参数的方法重载。然而,在我们的项目中,这种方法并不总是可以直接应用,因为这些方法通常有多个默认参数,并且我们将库与 IronPython 耦合到 Python 脚本接口(这有时会导致类型猜测问题)。
例如考虑这样的方法......
public void MyVectorMethod(Vector3D vec1 = new Vector3D(),
Vector3D vec2 = new Vector3D(), Vector3D vec3 = new Vector3D())
{ ... }
这段代码片段:
Vector3D actualVec;
if (vec == null) actualVec = Vector3D.UnitX();
else actualVec = (Vector3D) vec;
可以更优雅地表达如下:
vec ??= Vector3D.UnitX();