如何在C#中的运行时为函数参数赋值默认值

时间:2017-01-10 06:36:33

标签: c# function arguments

我有以下课程:

public class Location
{
    private int X { get; set; }
    private int Y { get; set; }
    private int Z { get; set; }

    public UpdateLocation(int X, int Y, int Z)
    {
        this.X = X;
        this.Y = Y;
        this.Z = Z;
    }
}

但是,有时我需要更新其中一些参数和所有参数。所以我在考虑一种初始化函数参数的方法,而不是将它们分配给局部变量,如:

public UpdateLocation(int X = this.X, int Y = this.Y, int Z = this.Z)
{
    this.X = X;
    this.Y = Y;
    this.Z = Z;
}

所以我可以这样调用这个函数:

UpdateLocation(Z:1509);

但显然,由于参数默认值必须是编译时常量,因此无法工作。任何想法如何解决这个问题,而不创建三个不同的更新功能(或更多)来更新这些变量?

3 个答案:

答案 0 :(得分:5)

public UpdateLocation(int? X = null, int? Y = null, int? Z = null)
{
    this.X = X ?? this.X;
    this.Y = Y ?? this.Y;
    this.Z = Z ?? this.Z;
}

您也可以设置属性。

答案 1 :(得分:3)

默认参数必须使用null或常量值初始化。

public UpdateLocation(int? X = null, int? Y = null, int? Z = null)
{
    if(X.HasValue) this.X = X.Value;
    if(Y.HasValue) this.Y = Y.Value;
    if(Z.HasValue) this.Z = Z.Value;

    // this.X = X ?? this.X;
    // this.Y = Y ?? this.Y;
    // this.Z = Z ?? this.Z;
}

现在选择更新

UpdateLocation(Y: 5, X: 2);

Here you can read about named arguments.

答案 2 :(得分:2)

Nullable Integers是很好的选择,欣赏这些答案,你也可以尝试这样的事情:

public const int minInt = int.MinValue;

public void UpdateLocation(int X = minInt, int Y = minInt, int Z = minInt)
{
    this.X = X == minInt ? this.X : X;
    this.Y = Y == minInt ? this.Y : Y;
    this.Z = Z == minInt ? this.Z : Z; ;
}