从String.Format,sprintf或串联中选择用于在F#中构建字符串的注意事项

Tri*_*Gao 2 f# string-formatting

在F#中至少有3种方法可以构建字符串:

  1. 良好的旧连接(沿途有.ToString(someFormat))
  2. 使用.NET的方法String.Format
  3. 使用sprintf函数

我应该在F#中坚持哪一个?

Jac*_* P. 5

在一般情况下,你应该使用printf基础的功能(例如,sprintf,bprintf在F#代码),他们是类型安全:编译器检查在编译时的格式字符串,并确保你传递了正确的参数类型.

这确实有一个缺点 - 但是在F#2.0和3.0中,printf基于功能的功能非常慢(搜索StackOverflow或谷歌,你会发现有关它的问题和博客文章).如果偶尔使用它们,它们不会影响应用程序的整体性能,但如果您经常调用它们,您会发现应用程序运行速度变慢.值得庆幸的是,这已经针对即将发布的F#3.1版本进行了修复.

至于其他选项,你应该尽可能避免字符串连接,因为它相对较慢并且还会产生额外的内存/ GC开销.如果你正在实现一些性能敏感的日志记录而你不能等待F#3.1,那么String.Format是你最好的选择; 为了模仿printf基于函数提供的类型安全性,您可以将对String.Format的每个调用移动到单独的函数中,然后使用类型注释显式指定参数类型.例如:

/// Prints the number of entries in a specified file to the console.
let inline printNumEntriesInFile (filename : string) (count : int) =
    System.String.Format ("The file '{0}' contains {1} entries.", filename, count)
Run Code Online (Sandbox Code Playgroud)