#c# #asp.net #boolean
#c# #asp.net #логическое значение
Вопрос:
Этот код выдает ошибку:
bool status1 = (bool)Cache["cache_req_head"];
bool status2 = (bool)Cache["cache_super"];
bool status3 = (bool)Cache["cache_head"];
Вот как были установлены переменные кэша:
if (checkreqhead == true)
{
Cache["cache_req_head"] = true;
}
else if (checksuper == true)
{
Cache["cache_super"] = true;
}
else if (checkhead == true)
{
Cache["cache_head"] = true;
}
Исходя из PHP
фона, это неудобно. Ошибка:
Ссылка на объект не установлена для экземпляра объекта
Я уверен, что это что-то действительно простое, но, вероятно, я не могу это определить.
СПАСИБО ВСЕМ ЗА ПОМОЩЬ 🙂
Комментарии:
1. Кстати: значение «== true» в ваших операторах if является избыточным.
Ответ №1:
«Ссылка на объект не установлена для экземпляра объекта» на языке c # означает «вы сделали что-то глупое со null
значением»
Если кэш пуст, вам нужно сначала проверить это
bool status1 = (bool)Cache["cache_req_head"];
должно быть
bool status1 = false;
if (Cache["cache_req_head"] != null)
{
status1 = (bool)Cache["cache_req_head"];
}
Это следствие того факта, что типы значений (например, bool, int и т. Д.) В c # Не могут быть нулевыми. Существует оболочка Nullable<T>
с сокращением T?
, которую вы можете использовать, если хотите разрешить нулевые значения для типов значений.
Вы можете привести свое значение к a bool?
, поскольку это позволяет null
.
bool? status1 = (bool?)Cache["cache_req_head"];
Затем вы можете проверить status1 == null
или status1.HasValue
, чтобы получить фактическое значение bool, которое вам нужно выбрать status1.Value
. Если вы выберете status1.Value
while status1 == null
, вы получите исключение во время выполнения, подобное тому, которое вы только что получили.
Комментарии:
1. Я не пробовал это последнее, но сработает ли это? Я бы подумал, что вам нужно сказать: bool? status1 = Cache[«cache_req_head»] как bool?
2. @MikeChristensen, мой тестовый код
object oBool = null; bool? nBool = oBool as bool?; Console.WriteLine(nBool); oBool = false; nBool = oBool as bool?; Console.WriteLine(nBool);
, похоже, работает нормально.3. @MikeChristensen
as bool
не будет работать, посколькуas T
требуетсяT
быть ссылочным типом. (какas
иначе можно вернуть значение null, если тип неверен?)4. Я не сказал как bool, я сказал «как bool?»
5. @MikeChristensen, aha. Ну,
as bool?
требуется только в том случае, если вы хотите обрабатывать другие типы, кроме bool, в том же ключе кэша. Кстати, посмотрите на Markdown в комментариях
Ответ №2:
На самом деле, лучший способ проверить, существует ли значение или нет Cache
, — это выполнить:
//string is used as an example; you should put the type you expect
string variable = Cache["KEY"] as string;
if(variable!=null)
{
// do something
}
Причина, по которой это if(Cache["KEY"]!=null) myVariable=Cache["Key"];
небезопасно, заключается в том, что объект, хранящийся в Cache["Key"]
, может быть удален Cache
до того, как вы получите возможность назначить его myVariable
, и вы в конечном итоге думаете, что myVariable содержит ненулевое значение.
Ответ №3:
Очевидно, что вы одновременно устанавливаете только одну из записей кэша. Поэтому, если вы не запустите код «setter» 3 раза только с 1 переменной, имеющей значение true, тогда вы всегда будете возвращать нули. null
не преобразуется в bool
, потому что это тип значения. Попробуйте использовать bool?
Ответ №4:
Поскольку Cache[] возвращает объект, который равен null, если не задан, то вы получаете исключение при попытке преобразовать null в bool .
Сначала вам нужно будет проверить, существует ли этот ключ, или вам придется установить для каждого ключа значение «false» по умолчанию.