C # Чтение десятичного значения из реестра - PullRequest
0 голосов
/ 23 мая 2009

У меня есть элемент управления NumericUpDown, и я хочу обновить его содержимое из реестра. Пока это то, что я получил:

this.apTime.Value = APRegsitry.GetValue("apTime").ToString();

Очевидно, что это не сработает, так как мне установить this.apTime в значение ключа реестра?

Ответы [ 2 ]

1 голос
/ 23 мая 2009

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

  • ключ реестра не существует
  • раздел реестра существует, но имя / значение не существует (null)
  • вы ожидаете string, значение не string типа (например, это int или byte[])
  • значение равно string, но не может быть преобразовано в decimal ("", "abc")

Если ключ не существует, RegistryKey.OpenSubKey(name) возвращает ноль. Возможно, вы захотите разобраться с этим и создать ключ. Если ключ существует, но нет пары имя / значение, то RegistryKey.GetValue(name) возвращает ноль. Вы можете справиться с этим, передав значение по умолчанию для перегрузки RegistryKey.GetValue(name, defaultValue) или используя ??.

Теперь, если пара имя / значение существует, но имеет недопустимое значение ("", "abc"), вы получите исключение из Parse(). Методы Parse()int, decimal, DateTime и т. Д.) В значительной степени устарели до TryParse(). Они возвращают false вместо броска FormatException.

// passing the default value to GetValue()
object regValue = APRegistry.GetValue("apTime", "0");
// ...same as...
object regValue = APRegistry.GetValue("apTime") ?? "0";

decimal value;

// regValue will never be null here, so safe to use ToString()
if(decimal.TryParse(regValue.ToString(), out value))
{
    this.apTime.Value = value;
}
else
{
    // Name/pair does not exist, is empty,
    // or has invalid value (can't parse as decimal).

    // Handle this case, possibly setting a default value like this:
    this.apTime.Value = 0; 
}
1 голос
/ 23 мая 2009

Я не совсем уверен, в чем проблема. У вас есть проблемы с преобразованием его в десятичную? Если это так, попробуйте Decimal.Parse

Object obj = APRegistry.GetValue("apTime");
String str = obj != null ? obj.ToString() : "0";
Decimal value = Decimal.Parse(str);
this.apTime.Value = value;

Если нет, то можете ли вы уточнить, в чем проблема?

РЕДАКТИРОВАТЬ Обновлен код для учета нулевого возврата из GetValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...