Подтвердить что ты не робот

Тип 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;
}
4b9b3361

Ответ 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). Теперь этот раздел должен выглядеть так (обратите внимание, что &lt; и &gt; используются для представления символов < и > внутри строки типа - это делается для правильного разбора xml VS):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" 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;
        }
    }