Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
.net F中的System.Console.WriteLine()与printfn#_.net_F# - Fatal编程技术网

.net F中的System.Console.WriteLine()与printfn#

.net F中的System.Console.WriteLine()与printfn#,.net,f#,.net,F#,F#中的以下两个语句之间有什么区别? 它们之间有什么优势或劣势(不包括明显的语法差异) 我知道WriteLine()是.NET的一部分,但不知道这可能有什么含义 示例代码: printfn "This is an integer: %d" 5 System.Console.WriteLine("This is an integer: {0}" , 5) 除了样式之外,System.Console.WriteLine还有能够重用参数的优点,即System.Console.WriteLine(“这

F#中的以下两个语句之间有什么区别? 它们之间有什么优势或劣势(不包括明显的语法差异)

我知道WriteLine()是.NET的一部分,但不知道这可能有什么含义

示例代码:

printfn "This is an integer: %d" 5
System.Console.WriteLine("This is an integer: {0}" , 5)

除了样式之外,
System.Console.WriteLine
还有能够重用参数的优点,即
System.Console.WriteLine(“这是一个整数,两次:{0}{0}”,5)

另外,如前所述,您可以使用
printfn
对F#object进行漂亮的打印,而这是
System.Console.WriteLine
所无法做到的,而且因为它不需要元组,所以您可以使用它进行部分应用


正如其他人所指出的,
printfn
使用反射,因此比
PrintLine
慢得多,但也是类型安全的。

printfn功能可以部分应用

let printDouble = printfn "%f"
printDouble 2.0
由于标准.NET函数将元组作为F#中的参数,因此不能在那里使用部分应用程序

printfn的第二个优点是,参数是类型化的。所以这不会编译:

let printDouble = printfn "%d"
printDouble 2.0

Console.WriteLine
相比,类似于
printf
的函数有一些优点和缺点

优点:

  • printfn
    函数是类型安全的:

    printfn "This is an integer: %i" 5 // works
    printfn "This is an integer: %i" "5" // doesn't compile
    
  • 使用
    printfn
    可以轻松地执行部分应用程序,而使用
    控制台则不同。由于过载过多,WriteLine

    [1; 2; 3] |> List.iter (printfn "%i; ")
    
  • printfn
    通过
    %A
    说明符更好地支持F#类型

缺点:


除了不能像前面提到的@mydogisbox那样重用参数外,还有
Console.WriteLine
(由于使用反射);您不应将前者用于日志记录目的。

printfn
及其各种近亲具有以下优点:

  • 它们比较短
  • 他们可以做一些静态类型检查;i、 e.
    printfn“%d”错误类型“
    将不会编译
  • …但您不必进行静态类型检查<代码>%O打印任何对象
  • 他们可以用
    %A
    打印数组、元组和有区别的联合等事物的“智能”表示法
  • 它们可以部分应用;i、 e.
    printfn“%d,%d”3
    是有效的表达式。这一点特别巧妙,因为编译器可以检查您在以后使用此子表达式时是否实际应用了正确数量的参数,这与
    Console.WriteLine不同,后者会乐于接受太多或太少的参数
实际上,最常见的部分应用程序可能只包括格式字符串;e、 g

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之前,它的速度也很慢。它的速度足够快,足以跟上您的编码器,但如果您以某种形式的序列化使用它,它可能会成为一个瓶颈。(作为Visual Studio 2013的一部分发布)声称可以显著提高性能,但我尚未对此进行验证


就我个人而言,我通常使用printfn进行探索性编码,然后我基本上坚持使用
%A
,偶尔还会加入其他说明符。但是,.NET本机字符串格式在某些情况下仍然很有用,因为它具有详细的区域性和与格式相关的选项。如果您希望获得最高速度,直接连接(或
StringBuilder
)将很容易超越这两者,因为这样可以避免解释格式字符串。

谢谢!:)在标记一个解决方案之前,将等待更多的答案(如果你能想到其他任何东西,请在这里记下)。@JoshuaGerrard,你知道,你可以随时移动“绿色标记”。@RamonSnir这是真的,但如果有一个已经标记为正确的答案,人们就不太可能回答(甚至看)。公平点。虽然我接受了另一个答案,但参数的重用是很好的!Mono使用System.IO.TextWriter感谢您提供的额外信息:)感谢您提供了非常清晰和有用的答案。如果你能详细说明“部分应用”部分,那就更好了!我同意通常应该使用
printfn
和相关函数,而不是
Console.WriteLine()
,但值得一提的是,它们也相对较慢(这可能对某些用例很重要)。我不知道,多亏了更新-我想我从未尝试过将其用于大量数据:-)更新@杰克。F#3.1显然更好地优化了printfn——发布页面宣传了一个性能提高40倍的示例(可能是因为避免了运行时反射)。看见