Вы не должны доверять значению из реестра, так как пользователь может редактировать его вне вашего приложения. Вам необходимо обработать следующие случаи:
- ключ реестра не существует
- раздел реестра существует, но имя / значение не существует (
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;
}