繁体   English   中英

F#中的System.Console.WriteLine()vs printfn

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM