我在_dicCache.TryGetValue(objID, out newObject);
收到NullReferenceException
线。我不知道为什么会发生这种情况。可以告诉我一个正确的方向吗?
这是我的班级:
public class Cache<T>
{
public string Name { get; set; }
private Dictionary<int, T> _dicCache = new Dictionary<int, T>();
public void Insert(int objID, T obj)
{
try
{
_dicCache.Add(objID, obj);
HttpContext.Current.Cache.Insert(Name, _dicCache, null, DateTime.Now.AddMinutes(10), TimeSpan.FromMinutes(0));
}
catch (Exception)
{
throw;
}
}
public bool Get(int objID, out T obj)
{
_dicCache = (Dictionary<int, T>)HttpContext.Current.Cache.Get(Name);
try
{
return _dicCache.TryGetValue(objID, out obj);
}
catch (Exception)
{
throw;
}
}
}
以下是我的称呼方式:
Services.Cache<Entities.User> cache = new Services.Cache<Entities.User>();
cache.Name = Enum.Cache.Names.usercache.ToString();
Entities.User user = new Entities.User();
cache.Get(pUserId, out user);
我也尝试过更改为Get class to:
public T Get(int objID, out T obj)
{
_dicCache = (Dictionary<int, T>)HttpContext.Current.Cache.Get(Name);
T newObject = (T)Activator.CreateInstance<T>();
try
{
_dicCache.TryGetValue(objID, out newObject);
obj = newObject;
return obj;
}
catch (Exception)
{
throw;
}
}
但我仍然在_dicCache.TryGetValue(objID, out newObject);
行获得相同的NullReferenceException。
答案 0 :(得分:7)
我认为,如果您的字典为空,那么您可以获得该异常的唯一方法就是。
_dicCache.TryGetValue(objID, out newObject);
null
是密钥的有效参数(如果TKey
是引用类型),但在您的情况下它是int
。
您确定_dicCache
不是null
吗?我会检查作业的价值:
_dicCache = (Dictionary<int, T>)HttpContext.Current.Cache.Get(Name);
答案 1 :(得分:1)
实际将_dicCache放入http上下文缓存的方法是insert方法,它永远不会在您的代码中调用,因此当您尝试从http上下文中获取它时,您将获得null(您只能调用Get)。
我会更改Name setter以实际将字典放入http上下文中,或者更好的是,如果您可以通过将Name属性作为构造函数参数以某种方式将字典插入构造函数的缓存中。一般来说,我尝试以尽可能少的时间处于“未初始化”状态的方式设计类。