是否有像 C++ 中那样带有分隔符的 C# 原始字符串?

Posted

技术标签:

【中文标题】是否有像 C++ 中那样带有分隔符的 C# 原始字符串?【英文标题】:Is there C# raw string with delimiter like in C++? 【发布时间】:2019-10-31 09:57:12 【问题描述】:

在 C++ 中,我们使用带有分隔符的 R"()" 获得原始文字字符串。所以下面这段代码很好:

const char SOMETEXT[] = R"+-+-+(<link rel="icon" href="img/favicon.png">)+-+-+"

我不知道如何在 C# 中做到这一点,据我所知有一个使用 @"" 的逐字字符串,但它没有分隔符。这会导致错误:

string SOMETEXT = @"<link rel="icon" href="img/favicon.png">";

C# 中是否有任何带有分隔符的原始文字字符串?因为我不想更改字符串,它会 PITA 稍后编辑。

【问题讨论】:

你想错了。 C# 中的字符串是一等公民,它们是 unicode(或 UTF16),而不仅仅是字符数组(就像它们在 C/C++ 中一样)。你想解决什么问题? @Neil OP 的 C++ 示例恰好是一个字符数组。 C++ 具有 std::string 并且还具有例如用于 UTF-8 编码文字的 u8 前缀。您正在考虑 C 或过时的 C++。请记住:在 C++ 中,您无需为不需要/使用的东西付费。 C# 在这方面有所不同,这里的性能不是“一等公民”。 【参考方案1】:

不,C# 中没有这样的东西。如果这是您需要频繁编辑的任意文本,您可能希望将其放入资源文件中。

我经常用于测试等中出现的 JSON 的另一种选择是只使用单引号而不是双引号,然后替换:

string text = "<link rel='icon' href='img/favicon.png'>".Replace('\'', '"');

【讨论】:

【参考方案2】:

@ed 字符串(又名逐字字符串文字)中,您可以将"" 用于双引号。

string SOMETEXT = @"<link rel=""icon"" href=""img/favicon.png"">";

在常规字符串文字中,您可以使用反斜杠。

string someText2 = "<link rel=\"icon\" href=\"img/favicon.png\">";

详细了解逐字和标准字符串文字之间的区别

请注意,只有引号转义序列(“”)不会在逐字文字字符串中逐字解释;所有其他的都是字面意思。

这是来自@ (C# Reference) 的示例。

以下示例说明了定义包含相同字符序列的常规字符串文字和逐字字符串文字的效果。

string s1 = "He said, \"This is the last \u0063hance\x0021\"";
string s2 = @"He said, ""This is the last \u0063hance\x0021""";

Console.WriteLine(s1);
Console.WriteLine(s2);
// The example displays the following output:
//     He said, "This is the last chance!"
//     He said, "This is the last \u0063hance\x0021"

我不想更改字符串!

如果您不想更改字符串,可以将其作为文件嵌入。对于单元测试,我经常将 json 文件存储为嵌入式资源并使用GetManifestResourceStream 加载它们。

【讨论】:

我还是不太明白这个问题,但这似乎是最有可能的答案(与分隔符无关,但实际上是转义)。

以上是关于是否有像 C++ 中那样带有分隔符的 C# 原始字符串?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中是不是有像现在 C# 中那样的特殊对象初始化器构造?

C#里面有像C++那样的map关联容器吗,如果有怎么用啊,很想用map<T,T>那样的容器啊

是否可以像在 c++ 中那样在多个 .cs 文件中展开 C# 类? [复制]

是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?

在 C# 中是不是有像 Dictionary<> 这样的类,但只有键,没有值?

在 C# 中解析原始协议缓冲区字节流