2

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

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

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

4

1 回答 1

5

通常,您应该在 F# 代码中使用printf基于 - 的函数(例如 , sprintfbprintf,它们是类型安全的:编译器在编译时检查格式字符串并确保您传递了正确的参数类型。

然而,这确实有一个缺点——在 F# 2.0 和 3.0 中,printf基于 - 的函数非常慢(搜索 StackOverflow 或 Google,您会找到有关它的问题和博客文章)。如果您偶尔使用它们,它们不会影响您的应用程序的整体性能,但如果您经常调用它们,您会注意到您的应用程序变慢了。值得庆幸的是,这已在即将发布的 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)
于 2013-09-08T17:08:16.377 回答