4

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

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

4

2 回答 2

8

我认为你可以有这个例外的唯一方法是如果你的字典是空的。

_dicCache.TryGetValue(objID, out newObject);

null是键的有效参数(如果TKey是引用类型),但在您的情况下它是int.

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

_dicCache = (Dictionary<int, T>)HttpContext.Current.Cache.Get(Name);
于 2012-12-26T00:26:57.480 回答
1

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

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

于 2012-12-26T00:20:57.430 回答