我在代码审查期间遇到了一些代码,其中一位老同事做了以下事情:
const string replacement = @"";
此字符串在正则表达式中用作替代匹配的内容。我的问题是将@ literal符号添加到空字符串的开头是什么意思。不应该有任何字面解释。
:@"";
和"";
之间的影响会有什么不同吗?
答案 0 :(得分:9)
此字符串用于正则表达式
正则表达式大量使用\
字符。例如,以下是一个正则表达式,用于匹配从0
到100
的前缀,它们总是有四个小数位:
^(100\.0000|[1-9]?\d\.\d{4})$
由于\
必须以更常见的C#语法转义为\\
@""
形式,因此可以更容易地阅读正则表达式,比较:
"^(100\\.0000|[1-9]?\\d\\.\\d{4})$"
@"^(100\.0000|[1-9]?\d\.\d{4})$"
因此,人们经常养成使用正则表达式时使用@""
形式的习惯,即使在它没有区别的情况下也是如此。首先,如果他们后来改变了它确实有所作为的东西,只需要改变表达式,而不是字符串本身的代码。
我建议这可能是您的同事在此特定情况下使用@""
而不是""
的原因。生成的.NET是相同的,但它们习惯于将@""
与正则表达式一起使用。
答案 1 :(得分:5)
查看MSDN documention for string literals。对于空字符串,它没有任何效果,但它会更改某些字符转义序列的行为以及换行符处理。从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";
答案 2 :(得分:4)
以下内容:
string a = @"";
string b = "";
生成此IL:
IL_0001: ldstr ""
IL_0006: stloc.0 // a
IL_0007: ldstr ""
IL_000C: stloc.1 // b
所以不,没有区别。