数据缓存从函数返回null值的机会

时间:2012-12-27 05:07:03

标签: c# asp.net caching

我有一个用C#编写的函数,它在检查并插入缓存后返回business-entity(make)的集合。

  public static Collection<CProductMakesProps> GetCachedSmartPhoneMake(HttpContext context)
    {
        var allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
        if (allMake == null)
        {
            context.Cache.Insert("SmartPhoneMake", new CModelRestrictionLogic().GetTopMakes(), null,
                                 DateTime.Now.AddHours(Int32.Parse(ConfigurationManager.AppSettings["MakeCacheTime"])),
                                 Cache.NoSlidingExpiration);

            allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
        }
        return allMake;
    }

我在其他页面中使用它如下

 var lobjprodMakeCol = CBrandCache.GetCachedSmartPhoneMake(Context);
 //CBrandCache is the class which contain the method 

我是否可能在lobjprodMakeCol

中获得空值

感谢。


修改

注意new CModelRestrictionLogic().GetTopMakes()是一个从数据库中提取记录的函数 它将返回0或更多的收集天气。

2 个答案:

答案 0 :(得分:1)

是的,如果演员as Collection<CProductMakesProps>失败,那么将为allMake分配一个null,因此这很大程度上取决于您从new CModelRestrictionLogic().GetTopMakes()返回的内容。

基于大多数缓存和/或字典集合允许您检查特定密钥的存在的假设,我建议采用稍微简化的方式来编写此代码:

public static Collection<CProductMakesProps> GetCachedSmartPhoneMake(HttpContext context)
{
    if (!context.Cache.ContainsKey("SmartPhoneMake") || context.Cache["SmartPhoneMake"] == null)
    {
        context.Cache.Insert("SmartPhoneMake"
                             , new CModelRestrictionLogic().GetTopMakes()
                             , null
                             , DateTime.Now.AddHours(Int32.Parse(ConfigurationManager.AppSettings["MakeCacheTime"]))
                             , Cache.NoSlidingExpiration);
    }

    return context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
}

答案 1 :(得分:1)

当你的函数返回null时,几乎没有可能 - 它们是

  1. GetTopMakes函数自我返回null
  2. 缓存过期时间为零(MakeCacheTime配置条目的值为零)
  3. 演员as Collection<CProductMakesProps>失败 - 如果GetTopMakes可能 返回一些不同的类型。
  4. 我希望下面的版本在上述所有情况下都不会返回null

    var allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
    if (allMake == null)
    {
       allMake = new CModelRestrictionLogic().GetTopMakes();
       context.Cache.Insert("SmartPhoneMake", allMake, 
          null, DateTime.UtcNow.AddHours(Int32.Parse(
          ConfigurationManager.AppSettings["MakeCacheTime"])), Cache.NoSlidingExpiration);
    }
    return allMake;
    

    另请注意,使用DateTime.UtcNow可避免任何意外情况,例如日光节省等。