C# необязательный параметр массива для класса

Я знаю, что это можно сделать с помощью null поэтому у меня есть обходной путь для этого, но мне было интересно, если есть лучший способ, что я могу иметь необязательный

6 ответов


лучший дизайн все вместе было бы иметь 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 ответственность решить, каковы значения по умолчанию, и, возможно, он должен получить его как зависимость в любом случае - см. твердый и Инъекции Зависимостей. Тогда у вас будет только 1 конструктор:

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

еще один вариант в толпе :), который ближе всего к вашему исходному коду

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 as static. Надеюсь, ты не против.


необязательные параметры массива невозможны в C#. От MSDN

каждый необязательный параметр имеет значение по умолчанию, как часть своего определения. Если для этого параметра не передается аргумент, используется значение по умолчанию. Значение по умолчанию должно быть одним из следующих типов выражений:

  • константное выражение;
  • выражение формы new ValType (), где ValType-это тип значения, например перечисление или struct;
  • выражение форма по умолчанию(ValType), где ValType-тип значения.

поэтому необходимо использовать" обходной путь". Либо проверьте значение null (как вы предложили), либо вы можете использовать конструктор по умолчанию.