Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Func<;的原因是什么;T>;in属性而不是简单的T_C#_Properties_Func - Fatal编程技术网

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;