使用默认结构体以外的默认结构体参数的方法

问题描述 投票:0回答:1

我们有一个名为

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())
{ ... }
c# struct ironpython default-arguments
1个回答
0
投票

这段代码片段:

Vector3D actualVec;
if (vec == null) actualVec = Vector3D.UnitX();
else actualVec = (Vector3D) vec;

可以更优雅地表达如下:

vec ??= Vector3D.UnitX();
© www.soinside.com 2019 - 2024. All rights reserved.