类的可选数组参数

本文关键字:数组 参数 | 更新日期: 2023-09-27 18:12:23

我知道这可以使用null,所以我有一个变通办法,但我想知道是否有一个更好的方法,我可以有一个可选的int[]参数为一个类?

class PriceLevels
{
    public int[] priceLevels { get; }
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels(int[] newPriceLevels = defaultPriceLevels)
    {
        priceLevels = newPriceLevels;
    }
}

这给了我一个错误,说它是一个无效的表达式defaultPriceLevels必须是常数。我该如何解决这个问题?

我能想到的一个解决方法是这样的,但我不太喜欢这个解决方案

class PriceLevels
{
    public int[] priceLevels { get; }
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels(int[] newPriceLevels = null)
    {
        if(newPriceLevels == null) 
            priceLevels = defaultPriceLevels;
        else 
            priceLevels = newPriceLevels;
    }
}

类的可选数组参数

一个更好的设计是有2个构造函数(构造函数重载)一个得到int[],另一个没有:

class PriceLevels
{
    public int[] priceLevels { get; set; }
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels()
    {
        priceLevels = defaultPriceLevels;
    }
    public PriceLevels(int[] newPriceLevels)
    {
       priceLevels = newPriceLevels;
    }
}

如果没有,不知道我是否会称之为"更好",但你可以使用 params关键字:

class PriceLevels
{
    public int[] priceLevels { get; set; }
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels(params int[] newPriceLevels)
    {
        priceLevels = newPriceLevels.Length == 0 ? defaultPriceLevels : newPriceLevels;
    }
}

此外,根据设计,我不相信PriceLevels有责任决定默认值是什么,也许它应该在任何情况下将其作为依赖项-参见SOLID和依赖注入。那么你就只有一个构造函数:

class PriceLevels
{
    public int[] priceLevels { get; set; }
    public PriceLevels(int[] newPriceLevels)
    {
       priceLevels = newPriceLevels;
    }
}

可以重载构造函数。

class PriceLevels
{
    public int[] priceLevels { get; private set; }
    private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels()
    {
        priceLevels = defaultPriceLevels;
    }
    public PriceLevels(int[] newPriceLevels)
    {
       priceLevels = newPriceLevels;
    }
}

您可以创建另一个没有参数的构造函数,只需将您的defaultPriceLevels变量传递给您已经拥有的构造函数?您还必须将变量更改为static。

class PriceLevels
{
    public int[] priceLevels { get; }
    private static int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
    public PriceLevels(int[] newPriceLevels = null)
    {
        if (newPriceLevels == null) priceLevels = defaultPriceLevels;
        else priceLevels = newPriceLevels;
    }
    public PriceLevels() : this(defaultPriceLevels)
    { }
}

Crowd中的另一个选项:),这是最接近原始代码的

class PriceLevels
{
  public int[] priceLevels { get; set; }
  private readonly int[] defaultPriceLevels = { 2, 3, 3, 4, 5, 6 };
  public PriceLevels(int[] newPriceLevels = null)
  {
     priceLevels = newPriceLevels ?? defaultPriceLevels;
  }
}

创建一个构造函数的重载!它可以很容易地完成一行代码!

public PriceLevels() : this(defaultPriceLevels) { }

然后,从原始构造函数中删除默认参数值:

public PriceLevels(int[] newPriceLevels)

实际上,您还需要将defaultPriceLevels声明为static。希望你不介意。

c#中不支持可选数组参数。从MSDN

每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送参数,则使用默认值。默认值必须是下列表达式类型之一:

  • 为常量表达式;
  • 形式为new ValType()的表达式,其中ValType是一个值类型,例如枚举或结构体;
  • 的表达式表单默认值(ValType),其中ValType是值类型。
因此,必须使用"变通方法"。要么检查null(如您所建议的),要么使用默认构造函数。