使用变量时,如何使用@ -sign进行转义?
File.Delete(@"c:\test"); // WORKS!
File.Delete(@path); // doesn't work :(
File.Delete(@"c:\test"+path); // WORKS
任何人都有任何想法?这是我想要使用的第二个例子!
答案 0 :(得分:3)
前缀为@
字符的字符串称为verbatim string literals(其内容无需转义)。
因此,您只能将@
与字符串文字一起使用,而不能使用字符串变量。
因此,在您事先分配路径之后(仅从逐字字符串或其他字符串),只需File.Delete(path);
即可。
答案 1 :(得分:3)
逐字字符串只是能够更容易地键入包含反斜杠(路径,正则表达式)的字符串的语法。声明
string path = "C:\\test";
string path = @"C:\test";
结果完全相同。两者都会生成包含C:\test
的字符串。请注意,只需要任一选项,因为C#语言将字符串中的\
视为特殊。
@
不是使路径正常工作所需的一些神奇的小精灵尘埃,它在字符串前缀时具有明确的含义,因为字符串的解释没有通常的\
转义序列。 / p>
你的第二个例子不能像你期望的那样工作的原因是@
以变量名称为前缀做了不同的事情:它允许你使用保留的关键字作为标识符,这样你就可以使用{{1}例如,作为标识符。对于不与关键字冲突的标识符,结果与不匹配。
如果你有一个包含路径的字符串变量,那么你通常可以假设根本不需要转义。毕竟它已经是一个字符串。上面提到的东西需要在运行时将源代码中的文本通过编译器正确地传递到字符串中,因为编译器有不同的想法。字符串本身只是始终表示相同的数据。
这仍然意味着您必须以反斜杠存活的方式初始化字符串。如果从某个地方读取它,则不需要特殊处理,如果你在代码中的其他地方将它作为常量字符串,则必须再次使用顶部的一个选项。
答案 2 :(得分:2)
答案 3 :(得分:2)
您对@指标的理解存在严重问题。
@"whatever string"
是文字字符串说明符逐字字符串文字。它的作用是告诉C#编译器不要查找转义序列。通常,"\"
是字符串中的转义序列,您可以执行"\n"
之类的操作来指示新行,或"\t"
来指示标签。但是,如果你有@"\n"
,它告诉编译器“不,我真的想把反斜杠视为反斜杠字符,而不是转义序列。”
如果您不喜欢文字模式,那么执行此操作的方法是在需要单个反斜杠的任何位置使用"\\"
,因为编译器知道将转义反斜杠视为单个字符。
在任何一种情况下,@"\n"
和"\\n"
都会在内存中生成一个包含2个字符的字符串,字符为'\'和'n'。你到达那里的方式并不重要;两种方法都告诉编译器你想要那两个字符。
鉴于此,@path
毫无意义,因为你没有任何文字字符 - 只是一个变量。当你拥有变量时,你已经在内存中拥有了你想要的字符。正如Joey所解释的那样它确实编译好了,但从逻辑上讲,它并不是你想要的。
如果您正在寻找一种方法来摆脱变量中\\
的出现,您只需要String.Replace
:
string ugly = @"C:\\foo";
ugly = ugly.Replace(@"\\", @"\");
答案 4 :(得分:0)
第一个和第三个是实际路径因此可以工作。
第二个甚至不会编译,如果
,它将起作用 string path = @"c:\test";
File.Delete(path);