如果我存储逐字字符串,
string s=@""Hello"";
它应该假设解析字符串并打印"Hello"
(将"
字符作为字符串的一部分)
但在实际操作中失败,而string s=@"""Hello""";
显示所需的输出("Hello"
)。
为什么语法需要额外的"
字符?如果C#以上述假设方式开始运作,那么破坏性结果会是什么?
答案 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;)表示您希望在字符串中包含引号字符。