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个。