Вы не должны доверять значение из реестра, поскольку пользователь может изменить его вне вашего приложения. Вы должны обращаться в следующих случаях:
- ключ реестра не существует
- ключ реестра существует, но имя/значение не существует (
null
)
- вы ожидаете
string
, значение не string
тип (например, это int
или byte[]
)
- значения является
string
, но не интерпретируемый в decimal
(""
, "abc"
)
Если ключ не существует, RegistryKey.OpenSubKey(name)
возвращает null. Возможно, вы захотите обработать это и создать ключ. Если ключ существует, но не пара имя/значение, то RegistryKey.GetValue(name)
возвращает null. Вы можете справиться с этим, передав значение по умолчанию для перегрузки 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;
}
Десятичное значение = Decimal.Parse (APRegistry.GetValue ("apTime"). ToString()); Вы забыли добавить Decimal.Parse. :) Также вы можете попробовать Convert.ToDecimal (stringValue); –
@Chris, Не стесняйтесь забыть о линии, на которой весь ваш ответ основан. Благодаря! – JaredPar
Я продолжаю получать «Необработанное исключение типа« System.NullReferenceException »произошло в program.exe« с decimal.parse и convert.todecimal – 2009-05-23 17:26:22