C#Class的可选数组参数

时间:2016-10-11 05:58:17

标签: c# class optional-parameters

我知道这可以使用null完成,所以我有一个解决方法,但我想知道是否有更好的方法可以为类提供可选的int[]参数?< / p>

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;
    }
}

6 个答案:

答案 0 :(得分:17)

一个更好的设计就是拥有 2个构造函数constructor overload)一个得到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; } }

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;
    }
}

如果没有,不知道我是否打电话给这个&#34;更好&#34;但您可以使用params keyword

PriceLevels

此外,根据设计,我并不相信class PriceLevels { public int[] priceLevels { get; set; } public PriceLevels(int[] newPriceLevels) { priceLevels = newPriceLevels; } } 有责任决定默认值是什么,也许它应该在任何情况下都将其作为依赖关系 - 请参阅{{3} }和 SOLID 。那么你只有一个构造函数:

attrib -h myfile.txt

答案 1 :(得分:9)

您可以重载构造函数。

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)
    { }
}

答案 2 :(得分:7)

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

e.g。

@Autowired

答案 3 :(得分:7)

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;
  }
}

答案 4 :(得分:4)

只需创建构造函数的重载!用一行代码就可以轻松完成它!

public PriceLevels() : this(defaultPriceLevels) { }

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

public PriceLevels(int[] newPriceLevels)

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

答案 5 :(得分:3)

C#中无法使用可选的数组参数。来自MSDN

  

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

     
      
  • 一个恒定的表达;
  •   
  • 表达式为新的ValType(),其中   ValType是一个值类型,例如枚举或结构;
  •   
  • 表达   表单默认值(ValType),其中ValType是值类型。
  •   

因此,&#34;解决方法&#34;必须使用。检查null(如您的建议)或者您可以使用默认构造函数。