C# 是否使用.NET本身不喜欢的匿名方法?

C# 是否使用.NET本身不喜欢的匿名方法?,c#,linq,.net-4.0,.net-4.5,anonymous-function,C#,Linq,.net 4.0,.net 4.5,Anonymous Function,所以,每当我试图调用WriteLog函数时,我都可以使用 I am trying to learn the anonymous method and tried out this sample. 优点是,我不需要单独的函数,可以保存代码行 ()=> { return "someLogData" }; 为什么.NET提供了这种匿名方法功能,但不允许在自己的类型中使用它?控制台中没有重载。WriteLine接受一个Func——事实上,即使您当前的WriteLog方法也不会做任何有用的事情(

所以,每当我试图调用WriteLog函数时,我都可以使用

I am trying to learn the anonymous method and tried out this sample.
优点是,我不需要单独的函数,可以保存代码行

()=> { return "someLogData" };

为什么.NET提供了这种匿名方法功能,但不允许在自己的类型中使用它?

控制台中没有重载。WriteLine接受一个
Func
——事实上,即使您当前的
WriteLog
方法也不会做任何有用的事情(因为您需要调用委托)

在确实存在接受特定委托的方法的地方——最主要的是在LINQ中,但在其他地方也是如此——您确实可以使用lambda表达式或匿名方法来调用它们

您可以使用lambda表达式调用
Console.WriteLine
,但需要将其强制转换为特定的委托类型-因为只有从lambda表达式到特定委托或表达式类型的转换,而不仅仅是
委托
对象
。因此,这将起作用:

Console.WriteLine( ()=> {return "someString" } );

控制台没有重载。WriteLine接受
函数
——事实上,即使是当前的
WriteLog
方法也不会做任何有用的事情(因为您需要调用委托)

在确实存在接受特定委托的方法的地方——最主要的是在LINQ中,但在其他地方也是如此——您确实可以使用lambda表达式或匿名方法来调用它们

您可以使用lambda表达式调用
Console.WriteLine
,但需要将其强制转换为特定的委托类型-因为只有从lambda表达式到特定委托或表达式类型的转换,而不仅仅是
委托
对象
。因此,这将起作用:

Console.WriteLine( ()=> {return "someString" } );

您需要执行匿名方法来获取字符串

WriteLog(() => "someLogData");
public void WriteLog(Func s)
{
Console.WriteLine(s());
}

您需要执行匿名方法来获取字符串

WriteLog(() => "someLogData");
public void WriteLog(Func s)
{
Console.WriteLine(s());
}

这种形式有一个优点:

public void WriteLog(Func<string> s)
{
    Console.WriteLine(s());
}
让我们将其与只接受
字符串作为参数的类似WriteLog进行比较:

WriteLog(() => StringThatNeedsFiveSecondsToBuild())
第二个
WriteLog
将始终花费5秒来构建字符串,即使
needToWriteLog
false
,而第一个将仅在
为true
时构建字符串

现在,将其与控制台进行比较。WriteLine
控制台。WriteLine
将始终打印其内容,因此无需使用委托,因为这5秒钟将始终花费

在C#中有一些类似的方法,即
Debug.*
Trace.*
家族中的方法,但它们是不同的。您可以这样使用它们:

WriteLog(StringThatNeedsFiveSecondsToBuild())
Debug.WriteLine(StringThatNeedsFiveSecondsToBuild())
诀窍在于它们的定义如下:

WriteLog(StringThatNeedsFiveSecondsToBuild())
Debug.WriteLine(StringThatNeedsFiveSecondsToBuild())
因此,如果未定义
DEBUG
,则整个
DEBUG.WriteLine(StringThatNeedsFiveSecondsToBuild())
将被删除,即使它有一些副作用(例如花费5秒:-)


所有这些都表明了另一点:非常重要的是,您传递给
WriteLog
的委托以及传递给
Debug.*
Assert.*
的参数没有副作用(显然忽略了时间的副作用,我指的是“真正的”副作用,如更改变量值),因为你不知道他们是否真的会被执行。

这种形式有一个优点:

public void WriteLog(Func<string> s)
{
    Console.WriteLine(s());
}
让我们将其与只接受
字符串作为参数的类似WriteLog进行比较:

WriteLog(() => StringThatNeedsFiveSecondsToBuild())
第二个
WriteLog
将始终花费5秒来构建字符串,即使
needToWriteLog
false
,而第一个将仅在
为true
时构建字符串

现在,将其与控制台进行比较。WriteLine
控制台。WriteLine
将始终打印其内容,因此无需使用委托,因为这5秒钟将始终花费

在C#中有一些类似的方法,即
Debug.*
Trace.*
家族中的方法,但它们是不同的。您可以这样使用它们:

WriteLog(StringThatNeedsFiveSecondsToBuild())
Debug.WriteLine(StringThatNeedsFiveSecondsToBuild())
诀窍在于它们的定义如下:

WriteLog(StringThatNeedsFiveSecondsToBuild())
Debug.WriteLine(StringThatNeedsFiveSecondsToBuild())
因此,如果未定义
DEBUG
,则整个
DEBUG.WriteLine(StringThatNeedsFiveSecondsToBuild())
将被删除,即使它有一些副作用(例如花费5秒:-)


所有这些都表明了另一点:非常重要的是,您传递给
WriteLog
的委托以及传递给
Debug.*
Assert.*
的参数没有副作用(显然忽略了时间的副作用,我指的是“真正的”副作用,如更改变量值),因为你不知道它们是否真的会被执行。

因为这不是真的必要。如果有成千上万的人像你一样,我想我们需要成千上万的
控制台。WriteLine
重载。请记住,
Console.Write
仅用于在
Console
窗口中输出一些字符串。@KingKing:有道理。。正如有人所说,遵循“接吻”原则!如果有成千上万像你这样的人,我想我们需要成千上万的
Console.WriteLine
重载。请记住,
Console.Write
仅用于在
Console
窗口中输出一些字符串。@KingKing:有道理。。正如有人所说,遵循“接吻”原则!谢谢你,乔恩。但是为什么你说WriteLog方法没有用?@nowhewhomustnotbenamed:目前你正在打印委托本身,而委托本身不会打印字符串。@JonSkeet:在第一行:“实际上,即使是你当前的WriteLog方法也没有用”@现在他不可以被命名了:你有没有试着像写的那样称呼它?结果如何?(这不是
someLogData
…)我的错!对不起,那之后我没有读这句话。我应该调用委托!谢谢你的评论,谢谢乔恩。但你为什么这么说