什么是硬编码多行字符串的最佳方法?

col*_*ang 23 f#

在单元测试中,我想将一行代码硬编码为字符串.

在C#我会这样做

var sb = new StringBuilder();
sb.AppendLine("myline1");
sb.AppendLine("myline2");
sb.AppendLine("myline3");
Run Code Online (Sandbox Code Playgroud)

自从我转换为F#后,我试图通过使用来减少.Net方法的使用bprintf,但不知何故没有bprintfn支持这对我来说很奇怪.

\r\n手动添加每行末尾很繁琐.

还是有比这更好的方法StringBuilder吗?

Kit*_*Kit 83

鲜为人知的特征:你确实可以缩进字符串内容 - 用反斜杠结束每一行.剥离以下行的前导空格:

let poem = "The lesser world was daubed\n\
            By a colorist of modest skill\n\
            A master limned you in the finest inks\n\
            And with a fresh-cut quill.\n"
Run Code Online (Sandbox Code Playgroud)

如果您希望将这些嵌入到最终字符串中,您仍然需要包含\n\n\r在行尾(如上例所示).

  • 哇,不知道!+1 (3认同)
  • 我不喜欢这种方法,因为我猜它不会使用与平台无关的`Environment.NewLine` (3认同)

byt*_*ter 50

如果你在F#3.0下,三引号字符串可能是答案:

let x = """
myline1
myline2
myline3"""   
Run Code Online (Sandbox Code Playgroud)


Jon*_*rop 11

我很惊讶没人提到这个:

[ "My first line"
  "second line"
  "another line" ]
|> String.concat "\n"
Run Code Online (Sandbox Code Playgroud)


pad*_*pad 7

我认为使用StringBuilderF#没有问题.

有一个函数fprintfnprintf的模块,这样你就可以与使用StringWriter对象:

let sw = new StringWriter()
fprintfn sw "myline1"
fprintfn sw "myline2"
fprintfn sw "myline3"
sw.ToString()
Run Code Online (Sandbox Code Playgroud)

我喜欢fprintf,fprintfn因为他们很灵活.您可以通过提供stdout来写入控制台输出.


MiM*_*iMo 6

您可以在F#中直接创建多行字符串文字:

let multiLineStr = 
  "myline1
myline2
myline3"
Run Code Online (Sandbox Code Playgroud)

和C#:

var multiLineStr =
  @"myline1
myline2
myline3";
Run Code Online (Sandbox Code Playgroud)