С# Опциональный параметр массива для класса
Я знаю, что это можно сделать с помощью 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;
}
}
Ответы
Ответ 1
Лучше всего было бы иметь конструкцию 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 и Инъекция зависимостей. Тогда у вас будет только 1 конструктор:
class PriceLevels
{
public int[] priceLevels { get; set; }
public PriceLevels(int[] newPriceLevels)
{
priceLevels = newPriceLevels;
}
}
Ответ 2
Вы можете перегрузить ваш конструктор.
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;
}
}
Ответ 3
Можно создать другой конструктор без параметров, которые просто передадут переменную 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)
{ }
}
Ответ 4
Другая опция в 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;
}
}
Ответ 5
Просто создайте перегрузку конструктора! Это можно легко сделать с помощью одной строки кода!
public PriceLevels() : this(defaultPriceLevels) { }
Затем удалите значение параметра по умолчанию из исходного конструктора:
public PriceLevels(int[] newPriceLevels)
Собственно, вам также нужно объявить defaultPriceLevels
как static
. Надеюсь, вы не против.
Ответ 6
Необязательные параметры массива невозможны в С#. Из MSDN
Каждый необязательный параметр имеет значение по умолчанию как часть своего определения. Если для этого параметра не передается аргумент, используется значение по умолчанию. Значение по умолчанию должно быть одним из следующих типов выражений:
- постоянное выражение;
- выражение формы new ValType(), где ValType - тип значения, например перечисление или структура;
- выражение форма по умолчанию (ValType), где ValType - тип значения.
Поэтому необходимо использовать "обходной путь". Либо проверьте значение null (как вы сказали), либо вы можете использовать конструктор по умолчанию.