4

その行でNullReferenceExceptionが発生してい_dicCache.TryGetValue(objID, out newObject); ます。そして、なぜこれが起こっているのか、私にはまったくわかりません。来る人は私を正しい方向に向けることができますか?

これが私のクラスです:

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);ます。

4

2 に答える 2

8

その例外を発生させる唯一の方法は、辞書がnullの場合だと思います。

_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コンテキストのキャッシュに配置するメソッドは、コードで呼び出されることのない挿入メソッドです。したがって、httpコンテキストから取得しようとすると、nullになります(Getを呼び出すだけです)。

Nameセッターを変更して、その時点で実際に辞書をhttpコンテキストに配置します。さらに、コンストラクターパラメーターとしてNameプロパティを取得することで、コンストラクターのキャッシュに辞書を挿入できる場合は、さらに良い方法です。一般に、クラスは、可能な限り最短時間で「初期化されていない」状態になるように設計しようとしています。

于 2012-12-26T00:20:57.430 に答える