【问题标题】:Why does attempting to verbatimize this string fail?为什么尝试逐字化此字符串会失败?
【发布时间】:2015-03-05 19:23:08
【问题描述】:

我想从字符串中删除这个子字符串:

<ArrayOfSiteQuery xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS">

意识到它充满了时髦,我认为逐字逐句可以解决所有问题:

String messedUpJunk = @"<ArrayOfSiteQuery xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS">";

...但是,用迷失太空中的机器人来解释,它不会计算(编译);我在第一个“http”上得到“; 预期”。

我可以通过转义引号使其可编译:

String messedUpJunk = "<ArrayOfSiteQuery xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS\">";

...但是如果不是逐字逐句,逐字有什么用呢?

【问题讨论】:

  • 想一想,如果您不转义",编译器怎么可能知道您的字符串文字的开始和结束位置?
  • 我认为逐字化应该只是告诉编译器“忘记试图弄清楚这一点 - 只需将内引号和外引号内的所有内容视为一个你不应该混淆或尝试解析的字符串。”

标签: c# escaping quotes verbatim-string


【解决方案1】:

双引号是您在逐字字符串中唯一需要转义的字符。转义它的方法不同,您需要将它加倍 ("") 而不是使用反斜杠:

String messedUpJunk = @"<ArrayOfSiteQuery xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" 
xmlns=""http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS"">";

MSDN link:

使用双引号将引号嵌入逐字字符串中

【讨论】:

    【解决方案2】:

    双引号需要转义(使用双双引号),其余字符不需要转义,例如反斜杠\

    见:2.4.4.5 String literals - C#

    逐字字符串文字由一个 @ 字符后跟一个 双引号字符、零个或多个字符和一个结束符 双引号字符。一个简单的例子是@"hello"。逐字逐句 字符串文字,分隔符之间的字符被解释 逐字逐句,唯一的例外是引号转义序列。在 特别是简单的转义序列以及十六进制和 Unicode 转义 序列不在逐字字符串文字中处理。逐字逐句 字符串字面量可以跨越多行。

    你需要转义双引号的原因是因为它代表字符串的开始和结束,无论是逐字的还是常规的。

    【讨论】:

    • 啊,我的老朋友,我的意思是朋友,回来了;我怕他发声什么的。
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2020-08-10
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2015-03-20
    • 2011-04-04
    相关资源
    最近更新 更多