在属性中使用Func <t>而不是简单T </t>的原因可能是什么

时间:2014-01-16 13:07:59

标签: c# properties func

我在代码中看到过这样的属性:

public static Func<string> TabMainDataToolTip
{
    get
    {
        return (Func<string>) (() => "Main Data");
    }
}

编辑:在某些地方,从应用资源(本地化)中检索实际的string值。

返回Func<T>而不是仅仅输入T的原因是什么?它有什么优势吗?

5 个答案:

答案 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>

但上述样本毫无意义。