我在代码审查期间遇到了一些代码,其中一位老同事做了以下事情:
const string replacement = @"";
Run Code Online (Sandbox Code Playgroud)
此字符串在正则表达式中用作替代匹配的内容.我的问题是将@ literal符号添加到空字符串的开头是什么意思.不应该有任何字面解释.
在@"";和 之间的影响会有什么不同"";吗?
此字符串用于正则表达式
正则表达式会大量使用该\字符.例如,下面是一个正则表达式匹配precentages来自0于100总是有四个小数位:
^(100\.0000|[1-9]?\d\.\d{4})$
Run Code Online (Sandbox Code Playgroud)
由于\拥有较为常见的C#语法进行转义\\的@""形式允许正则表达式更容易阅读,比较:
"^(100\\.0000|[1-9]?\\d\\.\\d{4})$"
@"^(100\.0000|[1-9]?\d\.\d{4})$"
Run Code Online (Sandbox Code Playgroud)
因此,人们经常养成@""在使用正则表达式时使用表单的习惯,即使在没有区别的情况下也是如此.首先,如果它们后来改变为确实有所改变的东西,则只需要更改表达式,而不是字符串本身的代码.
我建议这可能是你的同事使用@""而不是""在这种特殊情况下使用的原因.生成的.NET是相同的,但它们习惯于使用@""正则表达式.
查看MSDN文档中的字符串文字.对于空字符串,它没有任何效果,但它会更改某些字符转义序列的行为以及换行符处理.从MSDN站点获取的示例:
string a = "hello, world"; // hello, world
string b = @"hello, world"; // hello, world
string c = "hello \t world"; // hello world
string d = @"hello \t world"; // hello \t world
string e = "Joe said \"Hello\" to me"; // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me"; // Joe said "Hello" to me
string g = "\\\\server\\share\\file.txt"; // \\server\share\file.txt
string h = @"\\server\share\file.txt"; // \\server\share\file.txt
string i = "one\r\ntwo\r\nthree";
string j = @"one
two
three";
Run Code Online (Sandbox Code Playgroud)
下列:
string a = @"";
string b = "";
Run Code Online (Sandbox Code Playgroud)
生成此 IL:
IL_0001: ldstr ""
IL_0006: stloc.0 // a
IL_0007: ldstr ""
IL_000C: stloc.1 // b
Run Code Online (Sandbox Code Playgroud)
所以不,没有区别。