[英]Write boldface text using Console.WriteLine (C#) or printfn (F#)?
[英]System.Console.WriteLine() vs printfn in F#
F#中以下两个语句之间有什么区别? 它们相互比较有什么优点或缺点(不包括明显的语法差异)?
我知道WriteLine()是.NET的一部分,但不明白它可能带来什么影响。
示例代码:
printfn "This is an integer: %d" 5
System.Console.WriteLine("This is an integer: {0}" , 5)
printfn
及其各种堂兄弟有几个优点:
printfn "%d" "bad type"
将无法编译。 %O
打印任何对象 %A
歧视联合打印“智能”表示 printfn "%d, %d" 3
是有效的表达式。 这特别好用,因为编译器可以在以后使用此子表达式时检查您是否实际应用了正确数量的参数 - 与Console.WriteLine
不同,它很乐意接受太多或太少的参数。 实际上,最常见的部分应用程序可能只包含格式字符串; 例如
let printParticle = printfn "Particle at (%d, %d), state %A, p = %f"
printParticle 2 3 //compile time warning about ignored value
printParticle 3 4 someState 0.4 //fine
printParticle 5 6 someState 0.4 0.7 //compile-time error
但是,在F#3.1之前,它也很慢 。 它足够快,足以让你跟上编码器,但如果你在某种形式的序列化中使用它,它可能会变成瓶颈。 F#3.1发布公告 (作为Visual Studio 2013的一部分发布 )声称可以显着提高性能,但我还没有对此进行验证。
就个人而言,我通常使用printfn进行探索性编码,然后我主要坚持使用偶然的其他说明符来引入%A
。但是,.NET本机字符串格式在某些情况下仍然适用于其详细的文化和格式相关选项。 如果你想要最大速度直接连接(或一个StringBuilder
)将轻松胜过两者,因为这避免了解释格式字符串。
与Console.WriteLine
相比,这里有类似printf
的函数的优点和缺点。
优点:
printfn
函数是类型安全的:
printfn "This is an integer: %i" 5 // works printfn "This is an integer: %i" "5" // doesn't compile
使用printfn
进行部分应用很容易,但由于过载次数过多, Console.WriteLine
不是这种情况:
[1; 2; 3] |> List.iter (printfn "%i; ")
printfn
通过%A
说明符更好地支持F#类型。
缺点:
除了不能像@mydogisbox那样重用参数之外, printfn
的函数比Console.WriteLine
慢得多(由于使用了反射); 你不应该使用前者进行记录。
除了样式, System.Console.WriteLine
还具有能够重用参数的优点,即System.Console.WriteLine("This is a integer twice: {0} {0}", 5)
此外,如上所述在这里 ,你可以使用F#对象的漂亮印花printfn
你不能做System.Console.WriteLine
并且由于它并不需要一个元组,你可以用它做部分应用程序。
正如其他人所指出的, printfn
使用反射,因此比PrintLine
慢得多,但也是类型安全的。
printfn功能可以部分应用。
let printDouble = printfn "%f"
printDouble 2.0
由于标准.NET函数将元组作为F#中的参数,因此您无法在那里使用部分应用程序。
printfn的第二个优点是,参数是键入的。 所以这不会编译:
let printDouble = printfn "%d"
printDouble 2.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.