空字符串字面量

9

在进行代码审查时,我发现一位老同事编写的代码有以下情况:

const string replacement = @""; 

这个字符串被用在正则表达式中,作为匹配后替换的内容。我的问题是在一个空字符串前面添加@字面符号有什么作用。因为应该没有需要直接解释的内容。

@"";""; 之间有区别吗?


为什么不直接尝试在代码中进行比较呢? - paparazzo
调试器上没有区别,我想知道是否存在其他更具理论性质的潜在差异。 - FiringSquadWitness
@Blam 这并不总是那么简单... 例如,尝试这个 decimal x = 0.0m; decimal y = 0.00m; Console.Write("{0}, {1}, {2}", x, y, x == y); - DavidG
2
@Partha 我认为由于 OP 使用了正确的术语,他理解 @ 的含义,只是不明白为什么在空字符串上使用它会有任何有用的作用。 - AaronLS
@DavidG 这与 @"" 和 "" 有什么关系? - paparazzo
显示剩余10条评论
3个回答

9

这个字符串用于正则表达式

正则表达式中大量使用 \ 字符。例如,以下是一个正则表达式,用于匹配从 0100 的百分比,始终保留四位小数:

^(100\.0000|[1-9]?\d\.\d{4})$

由于在常见的C#语法中需要将\转义为\\@""形式使得正则表达式更容易被阅读,对比如下:

"^(100\\.0000|[1-9]?\\d\\.\\d{4})$"
@"^(100\.0000|[1-9]?\d\.\d{4})$"

由于这个原因,人们通常会养成使用@""形式的习惯,即使在没有区别的情况下也是如此。首先,如果他们以后改用某些需要区别的东西,则只需更改表达式,而不是字符串本身的代码。
我认为这可能就是为什么您的同事在这种特定情况下使用@""而不是""的原因。.NET生成的内容相同,但他们习惯于在正则表达式中使用@""

5

请查看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";

4
以下内容:
string a = @"";
string b = "";

生成以下IL代码:

IL_0001:  ldstr       ""
IL_0006:  stloc.0     // a
IL_0007:  ldstr       ""
IL_000C:  stloc.1     // b

所以,不,没有区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接