ASP.NET C # Bool приведение типов - PullRequest
1 голос
/ 10 октября 2011

Этот код выдает ошибку:

    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 фона, это неудобно.Ошибка:

Ссылка на объект не установлена ​​для экземпляра объекта

Я уверен, что это что-то действительно простое, но, вероятно, я не могу его обнаружить,

СПАСИБО ВСЕМ ЗА ПОМОЩЬ :)

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

«Ссылка на объект не установлена ​​для экземпляра объекта» - это c # lingo для «Вы сделали что-то глупое со значением 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?, которую вы можете использовать, если хотите разрешить нулевые значения для типов значений.

Вы можете привести свое значение к bool?, поскольку это позволяет null.

bool? status1 = (bool?)Cache["cache_req_head"];

Затем вы можете проверить status1 == null или status1.HasValue, чтобы получить реальное значение bool, вам нужно выбрать его с помощью status1.Value. Если вы выберете status1.Value, а status1 == null, вы получите исключение времени выполнения, подобное тому, которое вы только что получили.

2 голосов
/ 10 октября 2011

На самом деле лучший способ проверить, существует ли значение в 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 содержит ненулевое значение.

1 голос
/ 10 октября 2011

Вы, очевидно, устанавливаете только одну из записей кэша за раз.Таким образом, если вы не запускаете код «сеттера» 3 раза, а только для 1 переменной задано значение «истина», то всегда будут возвращаться нулевые значения.null не приводится к bool, потому что это тип значения.Попробуйте использовать bool?

0 голосов
/ 10 октября 2011

Так как Cache [] возвращает объект, который является нулевым, если не установлен, вы получаете исключение, пытающееся преобразовать ноль в bool.

Вы должны проверить, существует ли этот ключ первымили вам придется установить для каждого ключа значение «false» по умолчанию.

...