我在代码中看到过这样的属性:
public static Func<string> TabMainDataToolTip
{
get
{
return (Func<string>) (() => "Main Data");
}
}
编辑:在某些地方,从应用资源(本地化)中检索实际的string
值。
返回Func<T>
而不是仅仅输入T
的原因是什么?它有什么优势吗?
答案 0 :(得分:5)
Func<T>
封装一个没有参数的方法,并返回由TResult参数指定的类型的值。您可以使用此委托来表示方法,而 T 可用于表示类型。
答案 1 :(得分:2)
Func<TResult>
是.NET中的预定义委托。
符合此委托的方法将返回类型TResult
:
TResult someMethod(){}
您发布的代码:
public static Func<string> TabMainDataToolTip
{
get
{
return (Func<string>) (() => "Main Data");
}
}
表示属性TabMainDataToolTip
返回方法,返回类型为 string
。
在这种情况下,所述方法是:
() => "Main Data"
相当于:
string anonymousMethod()
{
return "Main Data";
}
实际上有 16个Func委托的变种,从0(零)到15个参数并返回1个结果。
示例:
Func<T,TResult>
表示这样的方法:
TResult someMethod(T parameterName)
{
return someTResultOject;
}
答案 2 :(得分:2)
在这个具体的例子中没有任何优势,只是额外的开销。
通常,此技术允许推迟最终结果的计算,直到确实需要它为止。例如,某些工具提示可能希望在其文本中包含“昂贵”信息 - 也许工具提示需要必须从Web服务获取的数据。
此方案允许属性getter的调用者获取“与最终结果一样好”的内容,而不强制他们在现场评估该结果。然后调用者可以决定稍后评估结果,或者使用工作线程或其他任何可能想要做的事情并行评估它。
答案 3 :(得分:1)
除了@ Jon的答案之外,你的代码就是这样消费的:
string mainData = TabMainDataToolTip();
注意括号。这对于房产来说是违反直觉的。
更好的实施将基于Lazy<T>
:
private static readonly Lazy<string> TabMainDataToolTipFactory = new Lazy<string>(() => "Main Data");
public static string TabMainDataToolTip
{
get
{
return TabMainDataToolTipFactory.Value;
}
}
用法示例:
string mainData = TabMainDataToolTip;
答案 4 :(得分:0)
Func<T>
就像任何其他返回T的方法一样。在你的案例字符串中。
这将帮助您将整个方法作为参数传递给任何其他方法。
您可以在MSDN
找到有关此代表的更多信息如果他们正在开发任何API,大多数人都更喜欢使用Func<T>
。
但上述样本毫无意义。