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

时间:2013-09-08 16:28:32

标签: f# string-formatting

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

  1. 良好的旧连接(沿途有.ToString(someFormat))
  2. 使用.NET的方法String.Format
  3. 使用sprintf功能
  4. 我应该在F#中坚持哪一个?

1 个答案:

答案 0 :(得分:5)

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

这有一个缺点,但是在F#2.0和3.0中,基于printf的功能非常慢(搜索StackOverflow或谷歌,你会发现有关它的问题和博客文章)。如果偶尔使用它们,它们不会影响应用程序的整体性能,但如果您经常调用它们,您会发现应用程序运行速度变慢。谢天谢地,this has been fixed for the upcoming F# 3.1 release

至于其他选项,应尽可能避免字符串连接,因为它相对较慢并且还会产生额外的内存/ 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)