Dictionary TryGetValue NullReferenceException

本文关键字:NullReferenceException TryGetValue Dictionary | 更新日期: 2023-09-27 17:49:42

我在_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类更改为:

    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;
        }
    }

但我仍然得到相同的NullReferenceException在_dicCache.TryGetValue(objID, out newObject);行。

Dictionary TryGetValue NullReferenceException

我认为只有当字典为空时才会出现这种异常。

_dicCache.TryGetValue(objID, out newObject);

null不是键的有效参数(如果TKey是引用类型),尽管在您的情况下它是int,所以不能为空。无论如何,如果传递keynull值,您将看到ArgumentNullException

你确定_dicCache不是null吗?我会检查赋值的值:

_dicCache = (Dictionary<int, T>)HttpContext.Current.Cache.Get(Name);

实际将_dicCache放入http上下文缓存的方法是在代码中从未调用的插入方法,因此当您尝试从http上下文中获取它时,您将获得null(您只调用get)。

我将更改Name setter,以便在当时实际将字典放入http上下文中,或者更好的是,如果您可以通过将Name属性作为构造函数参数以某种方式将字典插入构造函数中的缓存中。一般来说,我尝试以这样一种方式来设计类,使它们在尽可能少的时间内处于"未初始化"状态。