C# 使用Func<;的原因是什么;T>;in属性而不是简单的T
我在代码中看到了这样的属性:C# 使用Func<;的原因是什么;T>;in属性而不是简单的T,c#,properties,func,C#,Properties,Func,我在代码中看到了这样的属性: public static Func<string> TabMainDataToolTip { get { return (Func<string>) (() => "Main Data"); } } public static Func tabmain数据工具提示 { 得到 { 返回(Func)(()=>“主数据”); } } 编辑:在某些地方,实际的字符串值是从应用程序资源(本地化)中检索
public static Func<string> TabMainDataToolTip
{
get
{
return (Func<string>) (() => "Main Data");
}
}
public static Func tabmain数据工具提示
{
得到
{
返回(Func)(()=>“主数据”);
}
}
编辑:在某些地方,实际的字符串
值是从应用程序资源(本地化)中检索的
返回Func
而不只是键入T
的原因是什么?它有什么好处吗?Func
封装了一个没有参数的方法,并返回由TResult参数指定的类型的值。您可以使用此委托来表示方法,而T可用于表示类型Func
是.NET中预定义的委托
符合此委托的方法将具有返回类型TResult
:
TResult someMethod(){}
您发布的代码:
public static Func<string> TabMainDataToolTip
{
get
{
return (Func<string>) (() => "Main Data");
}
}
相当于:
string anonymousMethod()
{
return "Main Data";
}
实际上,Func委托有16种变体,从0(零)到15个参数,并返回1个结果
例如:
Func<T,TResult>
在这个特定的示例中,没有优势,只是额外的开销 通常,这种技术允许将最终结果的计算推迟到真正需要时进行。例如,某些类型的工具提示可能希望在其文本中包含“昂贵”的信息——可能工具提示需要从web服务获取的数据 此方案允许属性getter的调用者获得与最终结果“一样好”的内容,而不必强迫他们当场评估该结果。然后,调用方可以决定稍后对结果求值,或者使用工作线程并行求值,或者执行它可能要执行的任何其他操作。
Func
与任何其他方法一样,它将在您的大小写字符串中返回T
这将帮助您将整个方法作为参数传递给任何其他方法
您可以在以下位置找到有关此代理的更多信息:
如果开发任何API,大多数人都喜欢使用Func
但是上面的示例毫无意义。除了@Jon的答案之外,您的代码如下所示:
TResult someMethod(T parameterName)
{
return someTResultOject;
}
string mainData = TabMainDataToolTip();
注意括号。这与属性的直觉相反
更好的实现应该基于Lazy
:
除了其他答案外,在调用
Func
时,有时您可能需要一些信息/状态。例如,当调用Func
时,您可能需要DateTime.Now
。您可能还需要做一些额外的工作。例如,如果是星期二,则返回一个字符串,否则返回另一个字符串
您可能需要
Func
的另一个原因是,在某些情况下可能会调用它,但在其他情况下可能永远不会调用它,因此Func
中的代码可能永远不会执行。好吧,在这种情况下,我能看到的唯一一件事是,它允许您像方法var text=tabmaindatooltip()一样“执行”属性代码>这会让每个人都感到困惑。看起来像是模糊处理的产物。它在代码中看起来完全一样吗?或者您在粘贴到这里之前做了一些简化?这是对任何类型的一般用法问题的正确回答。在我的例子中,对于字符串,它看起来更像是一个开销,或者是自动生成的代码。它取决于Func
传递到的类以及该类对其执行的操作。我知道它只要求一个字符串,但是考虑到灵活性:设计者可能认为,在FUNC被调用的确切时间,您可能需要一些状态。很难说。如果您熟悉NewtonSoft JSON库,您会注意到JsonConvert
有一个属性Func DefaultSettings
,它是Func
。它不需要是Func
,但因为它是,所以它提供了根据调用时间返回不同内容的灵活性。
string mainData = TabMainDataToolTip();
private static readonly Lazy<string> TabMainDataToolTipFactory = new Lazy<string>(() => "Main Data");
public static string TabMainDataToolTip
{
get
{
return TabMainDataToolTipFactory.Value;
}
}
string mainData = TabMainDataToolTip;