F#(或C#)中有没有类似Python三重引号的东西?

17 投票
5 回答
8346 浏览
提问于 2025-04-15 22:45

我想把一段 XML 代码放到一个字符串变量里。在 Python 中,我可以用三重引号来做到这一点,这样就不用担心单引号或双引号的问题。请问在 F# 或 C# 中有没有类似的方法呢?

5 个回答

6

如果有人在找C#中的三重引号字符串(而不是F#),那么C#11现在有了原始字符串字面量,我觉得它们比Python的更好(因为处理缩进的方式)!

原始字符串字面量是一种新的字符串格式。原始字符串字面量可以包含任意文本,包括空格、换行、嵌入的引号和其他特殊字符,而不需要使用转义序列。一个原始字符串字面量至少以三个双引号(""")开始,并以相同数量的双引号结束。通常,原始字符串字面量在一行中用三个双引号开始,在另一行中用三个双引号结束。开头引号后和结尾引号前的换行符不会包含在最终内容中:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

在结尾双引号左侧的任何空格都会从字符串字面量中删除。原始字符串字面量可以与字符串插值结合使用,以在输出文本中包含大括号。多个$字符表示连续的大括号开始和结束插值的数量:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

前面的例子说明了两个大括号开始和结束插值。第三个重复的开闭大括号会包含在输出字符串中。

https://devblogs.microsoft.com/dotnet/csharp-11-preview-updates/#raw-string-literals https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11#raw-string-literals

18

F# 3.0 版本支持三重引号字符串。你可以查看 Visual Studio F# 团队博客关于 3.0 特性的文章

F# 3.0 规范字符串和字符 部分特别提到了 XML 的使用场景:

三重引号字符串是用三个引号(""")来表示的,这样可以确保包含一个或多个转义字符串的字符串被逐字解释。举个例子,三重引号字符串可以用来嵌入 XML 数据:

14

据我所知,C# 和 F# 中没有对应的语法。如果你使用 @"str",那么你需要把引号替换成两个引号;如果你只是用 "str",那么你需要加反斜杠。

无论如何," 的编码方式是这样的:

var str = @"allows
  multiline, but still need to encode "" as two chars";
var str = "need to use backslahs \" here";

不过,当你需要在应用程序中嵌入大字符串(比如 XML 数据)时,最好的办法可能是使用 .NET 资源(或者根据你的应用把数据存储在其他地方)。在程序中嵌入大字符串通常不是很推荐。此外,曾经有一个插件可以把 XML 作为树结构粘贴,这样可以构建 XElement 对象用于 C#,但我不确定这个插件现在是否还存在。

不过,我个人会支持在 F# 中添加 """,就像 Python 中那样 - 这非常有用,特别是在交互式脚本中。

撰写回答