C#Func <object> getObject的目的是什么?

时间:2017-07-13 14:07:18

标签: c# func

我找到了以下代码片段,并想知道Func<object> getObject属性的用途是什么:

public void InsertCacheItem(string key, Func<object> getObject, TimeSpan duration)
{
    try
    {
        var value = getObject();
        if (value == null)
            return;

        key = GetCacheKey(key);

        _cache.Insert(
            key,
            value,
            null,
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            duration,
            System.Web.Caching.CacheItemPriority.Normal,
            null);
    }
    catch { }
}

如何通过传递Func属性来调用此特定函数?

2 个答案:

答案 0 :(得分:6)

您可以使用以下内容来表示:

InsertCacheItem("bob", () => "valuetocache", TimeSpan.FromHours(1));

但为什么这样呢?为什么不直接传入&#34; valuetocache&#34;?好吧,主要是由于try..catch。写入的代码意味着即使Func无法执行,调用代码也不会受到影响。

所以:

InsertCacheItem("bob", () => MethodThatThrowsException(), TimeSpan.FromHours(1));
例如,

仍然有用。 它不会缓存任何内容,但它不会冒出调用代码的异常。

答案 1 :(得分:1)

对于上面的代码,除了捕获异常之外,它实际上几乎没有意义。您通常会在函数中看到这一点,以从缓存中检索某些内容。例如:

public object GetCacheItem(string key, Func<object> getObject, TimeSpan duration)
{
    var value = GetItemFromCache(key);

    if (value == null)
    {
        value = getObject();

        _cache.Insert(
            key,
            value,
            null,
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            duration,
            System.Web.Caching.CacheItemPriority.Normal,
            null);
    }

    return value;
}

现在我们可以从缓存中检索,否则我们会调用潜在的昂贵操作来再次创建值。例如:

var listOfZombies = GetCacheItem(
    "zombies", 
    () => GetZombiesFromDatabaseWhichWillTakeALongTime(), 
    TimeSpan.FromMinutes(10));