C#Class的可选数组参数

Adj*_*jit 14 c# class optional-parameters

我知道这可以使用,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,说它是一个无效的表达式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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gil*_*een 17

一个更好的设计就是拥有2个构造函数(构造函数重载),一个获取a 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有,不知道我是否称之为"更好",但你可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,根据设计,我不相信PriceLevels确定默认值是什么是责任,并且可能在任何情况下都应该将其作为依赖项 - 请参阅SOLID依赖注入.然后你只有1个构造函数:

class PriceLevels
{
    public int[] priceLevels { get; set; }

    public PriceLevels(int[] newPriceLevels)
    {
       priceLevels = newPriceLevels;
    }
}
Run Code Online (Sandbox Code Playgroud)


jeg*_*ado 9

您可以重载构造函数.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果仅在构造函数中设置了值,则不需要C#6.0. (2认同)

Mat*_*hew 7

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

例如

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)
    { }
}
Run Code Online (Sandbox Code Playgroud)


Mri*_*boj 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;
  }
}
Run Code Online (Sandbox Code Playgroud)