C#Func的目的是什么<;对象>;获取对象?

C#Func的目的是什么<;对象>;获取对象?,c#,func,C#,Func,我找到了以下代码片段,想知道Func getObject属性的用途是什么: public void InsertCacheItem(string key, Func<object> getObject, TimeSpan duration) { try { var value = getObject(); if (value == null) return; key = GetCacheKey(

我找到了以下代码片段,想知道
Func 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 { }
}
public void InsertCacheItem(字符串键、Func getObject、TimeSpan持续时间)
{
尝试
{
var value=getObject();
如果(值==null)
返回;
key=GetCacheKey(key);
_缓存.插入(
钥匙
价值
无效的
System.Web.Caching.Cache.NoAbsoluteExport,
期间
System.Web.Caching.CacheItemPriority.Normal,
无效);
}
捕获{}
}

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

您可以通过以下方式调用此函数:

InsertCacheItem("bob", () => "valuetocache", TimeSpan.FromHours(1));
但为什么要这样做呢?为什么不直接输入“valuetocache”?好吧,主要是因为
try..catch
。编写的代码意味着即使
Func
无法执行,调用代码也不会受到影响

因此:


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

您可以通过以下方式调用此代码:

InsertCacheItem("bob", () => "valuetocache", TimeSpan.FromHours(1));
但为什么要这样做呢?为什么不直接输入“valuetocache”?好吧,主要是因为
try..catch
。编写的代码意味着即使
Func
无法执行,调用代码也不会受到影响

因此:


例如,它仍然有效。它不会缓存任何东西,但不会冒泡出调用代码的异常。

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

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

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

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


为什么他们使用此委托而不只是传递对象的值?在上面的代码中,这实际上是毫无意义的。@RandRandom oops,bad tag:)无论如何,评论者删除了cmmentwhy他们使用此委托而不只是传递对象的值?在上面的代码中,这实际上完全没有意义。@randoops,bad tag:)无论如何,评论员删除了cmmentAah ok是有意义的!感谢intelJust旁白,但如果我在代码评审中发现一个函数是以这种方式实现的,我将与编写它的开发人员进行讨论。即使忽略“无用”的委托,空的和未记录的
catch
也是一种代码味道。代码味道就是缺少的文档。这也是OP提出这个问题的原因。但正如答案所示,代码本身是有意义的<代码>方法ThrowsException可能位于另一个(第三方)库中或插入的委托中。但是,必须确保这段代码毫无例外地运行!感谢intelJust旁白,但如果我在代码评审中发现一个函数是以这种方式实现的,我将与编写它的开发人员进行讨论。即使忽略“无用”的委托,空的和未记录的
catch
也是一种代码味道。代码味道就是缺少的文档。这也是OP提出这个问题的原因。但正如答案所示,代码本身是有意义的<代码>方法ThrowsException可能位于另一个(第三方)库中或插入的委托中。但是,必须确保此代码无异常运行。我仍然不明白,如果只是为了捕获某个异常,那么如果只是传递一个对象而不是Func将具有相同的效果(因为一个简单的值不会导致异常),那么为什么要使用
Func
,这就是为什么我说它实际上是无用的。你是如何得到
简单值的
@LeiYang的?获取
简单值的代码是否有可能引发异常?因为,如果它这样做了,这就是使用
Func
试图解决的问题。@mjwills如果我在函数外部得到值,该函数也用try-catch包装,然后将值传入,会怎么样?当.NET1.1中没有
Func
时,您的意思是我们无法捕获异常吗?@LeiYang是的,这肯定会起作用。原始帖子中显示的方法的优点是,如果你有100个调用方要
InsertCacheItem
,你只需要一次尝试..catch而不是100个。我仍然不明白,如果只是为了捕获一些异常,那么如果只是传递一个对象而不是Func,将产生同样的效果(因为简单值不会导致异常),那么为什么要使用
Func
?确切地说,这就是为什么我说它实际上是无用的。你是如何得到
简单值
@LeiYang的?得到
简单值
的代码有没有可能抛出异常?因为,如果有,这就是使用
Func
试图解决的问题。@mjwills如果我得到的值超出我的值会怎么样函数的de,该函数也用try-catch包装,然后传入值?当.net 1.1中没有
Func
时,您的意思是我们无法捕获异常吗?@LeiYang是的,这肯定会起作用。原始帖子中显示的方法的优点是,如果有100个调用方
InsertCacheItem
,您需要只需一次尝试,就可以抓住100个。