这是c#(或可能是VB.net)的.NET问题,但我试图弄清楚以下声明之间的区别:
string hello = "hello";
vs.
string hello_alias = @"hello";
在控制台上打印没有区别,长度属性是相同的。
这是c#(或可能是VB.net)的.NET问题,但我试图弄清楚以下声明之间的区别:
string hello = "hello";
vs.
string hello_alias = @"hello";
在控制台上打印没有区别,长度属性是相同的。
当前回答
它将字符串标记为逐字串字面值——字符串中任何通常会被解释为转义序列的内容都将被忽略。
所以"C:\\Users\\Rich"和"C:\Users\Rich"是一样的
有一个例外:双引号需要转义序列。要转义双引号,需要在一行中放入两个双引号。例如,@""""的计算结果为“。
其他回答
既然你也明确地要求使用VB,让我补充一下,这种逐字逐句的字符串语法在VB中不存在,只在c#中存在。相反,在VB中,所有字符串都是逐字逐句的(除了它们不能包含换行符,不像c#逐字逐句的字符串):
Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""
VB中不存在转义序列(除了引号字符的加倍,就像c#中的逐字字符串一样),这使得一些事情更加复杂。例如,要在VB中编写以下代码,您需要使用连接(或任何其他构造字符串的方法)
string x = "Foo\nbar";
在VB中,这将被写成如下:
Dim x = "Foo" & Environment.NewLine & "bar"
(&是VB字符串连接操作符。+也可以同样使用。)
这是一个逐字字符串,并更改转义规则-现在唯一被转义的字符是“,转义为“”。这对于文件路径和regex特别有用:
var path = @"c:\some\location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
etc
原因很简单。为了表示字符串“string\”,编译器需要“string\\”,因为\是一个转义字符。如果你用@"string\"代替,你就可以忘记" \\ "了。
将@放在字符串前面可以使用特殊字符,如反斜杠或双引号,而不必使用特殊代码或转义字符。
所以你可以这样写:
string path = @"C:\My path\";
而不是:
string path = "C:\\My path\\";
它将字符串标记为逐字串字面值——字符串中任何通常会被解释为转义序列的内容都将被忽略。
所以"C:\\Users\\Rich"和"C:\Users\Rich"是一样的
有一个例外:双引号需要转义序列。要转义双引号,需要在一行中放入两个双引号。例如,@""""的计算结果为“。