Тип Nullable int разрешен в Settings.settings?
У меня есть свойство, которое я хотел бы ввести как int?
в файле Settings.settings. Когда я использую int?
, я получаю отказ во время выполнения:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта.
Я могу использовать строковый тип в качестве обходного пути, где проверка на null работает, но я должен разбирать строку и обрабатывать ошибки, когда синтаксический разбор не работает.
Возможность установки значения в null позволяет мне сохранить свойство, задокументированное в файле настроек, и сделать очевидным, что значение не было установлено. Когда он не установлен, я использую запрограммированное значение по умолчанию:
int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits;
if ( configuredNumberOfLimits == null )
{
requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
Ответы
Ответ 1
Я думаю, что ваш лучший выбор - старомодное сочетание bool
/int
. Это не самое красивое решение, но это не все, что отличается от int?
.
int configuredNumberOfLimits;
if (Settings.Default.HasRequiredNumberOfLimits)
{
configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits;
}
else
{
configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
Ответ 2
Существует способ использования типа с нулевым значением (например, int?
) для настройки - для этого требуется небольшое ручное редактирование файла настроек, но впоследствии отлично работает в среде VS и в коде. И не требует дополнительных функций или оберток.
Для этого создайте параметр с нужным именем (например, RequiredNumberOfLimit) и сделайте его для любого типа (например, стандартным int
для удобства).
Сохраните изменения.
Теперь перейдите в папку проекта и откройте файл "Свойства\Настройки .settings" с помощью текстового редактора (например, "Блокнот" ). Или вы можете открыть его в VS, щелкнув правой кнопкой мыши в обозревателе решений на "< Your Project > → Свойства → Настройки.настройки", выберите "Открыть с...", а затем выберите "Редактор XML" или "Редактор исходного кода (Текст)".
В открытых настройках xml найдите свою настройку (она будет выглядеть так:):
<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
Измените параметр "Тип" от System.Int32
до System.Nullable<System.Int32>
. А также очистите значение по умолчанию (поэтому по умолчанию может использоваться значение null).
Теперь этот раздел должен выглядеть так (обратите внимание, что <
и >
используются для представления символов <
и >
внутри строки типа - это делается для правильного разбора xml VS):
<Setting Name="RequiredNumberOfLimit" Type="System.Nullable<System.Int32>" Scope="User">
<Value Profile="(Default)" />
</Setting>
Теперь сохраните изменения и заново откройте настройки проекта - voilà! - у нас есть параметр RequiredNumberOfLimit с типом System.Nullable<System.Int32>
, который правильно разбирается с помощью VS Settings Designer, а также может использоваться как нормальная переменная int?
в коде.
Если вы хотите, чтобы этот параметр мог возвращать null
, вы должны оставить поле значения по умолчанию чистым.
В противном случае значение по умолчанию будет возвращено этим параметром, если ранее ему было присвоено значение null (но как работают значения по умолчанию, не так ли?: P).
Ответ 3
Как насчет:
int configuredNumberOfLimits
if(!int.TryParse(Settings.Default.RequiredNumberOfLimits,
out configuredNumberOfLimits))
{
configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
Таким образом вы можете проверить значение, и если он не работает, вы задаете значение по умолчанию. Не стоит беспокоиться о строках или синтаксическом анализе или об исключении без обработки.
Ответ 4
Вы можете ввести ручной тип набора в Settings.Designer.cs
Например:
public decimal? Test{
get {
return ((decimal?)(this["Test"]));
}
set {
this["Test"] = value;
}
}