为什么C#需要两个双引号来打印“在逐字字符串的情况下?

时间:2014-12-30 12:59:54

标签: c# programming-languages double-quotes verbatim-string

如果我存储逐字字符串,  string s=@""Hello"";它应该假设解析字符串并打印"Hello"(将"字符作为字符串的一部分)

但在实际操作中失败,而string s=@"""Hello""";显示所需的输出("Hello")。

为什么语法需要额外的"字符?如果C#以上述假设方式开始运作,那么破坏性结果会是什么?

2 个答案:

答案 0 :(得分:7)

  

技术上,字符串s = @"" Hello"&#34 ;;应该打印"你好"

不,那只会无效。编译器应该 - 并且确实 - 遵守语言规范的规则。

在逐字字符串文字中,双引号必须加倍(不是三倍),以区别于双引号,只是意味着&#34;字符串的结尾&#34;。< / p>

如果你在字符串中间使用双引号,而不是在开头或结尾处,最容易看到这个:

string x = @"start "" end";
  

F#在上述情况下完美无缺

不是我能看到的。在VS2015预览中的示例F#项目中:

let x = @""Hello""

...会出错,而@"""Hello"""会产生"Hello"字符串。

此外,F# verbatim string literal documentation表明它完全按照C#工作:

  

如果以@符号开头,则文字是逐字字符串。这意味着忽略任何转义序列,除了两个引号字符被解释为一个引号字符

基本上,听起来像逐字字符串文字在C#和F#中都能很好地工作,两者都要求双引号加倍。 F#也有三倍引用的字符串,其中需要加倍......但这只是C#没有的单独功能。< / p>

编辑:要回答关于歧义的评论,您举了一个@"1"2""的例子。让我稍微改变一下:

string x = @"1"+"";

目前在C#中,这意味着逐字字符串文字与内容1和空的常规字符串文字的串联。如果你提议它实际是一个内容为1"+"的单个逐字字符串文字,解析器在下一个分号结束之前直接依赖于引号逐字字符串文字,这让我觉得非常糟糕。例如,假设我想使用逐字字符串文字作为双参数方法调用中的第一个参数,如下所示:

Console.WriteLine(@"Foo {0}", "Bar");

根据你的规则,这将是一个带有单个参数的调用 - 作为单个语句,不可能代表我们正在尝试进行的调用。 (您需要为逐字字符串文字使用变量,以避免弄乱它。)

简而言之,我对C#已经运作的方式感到高兴。

答案 1 :(得分:2)

那是因为你需要一个开放和关闭&#34;人物也是。所以用像你这样的一行:

s=@"""Hello""";

第一个和最后一个引号字符用于指示编译器的字符串的开头和结尾。然后在字符串中双引号序列(&#34;&#34;)表示您希望在字符串中包含引号字符。