当前位置:  开发笔记 > 编程语言 > 正文

在C#中字符串前面的@是什么?

如何解决《在C#中字符串前面的@是什么?》经验,为你挑选了8个好方法。

这是C#(或可能是VB.net)的.NET问题,但我试图找出以下声明之间的区别:

string hello = "hello";

string hello_alias = @"hello";

在控制台上打印没有区别,长度属性是相同的.



1> Richard Ever..:

它将字符串标记为逐字字符串文字 - 字符串中通常被解释为转义序列的任何内容都将被忽略.

所以"C:\\Users\\Rich"是一样的@"C:\Users\Rich"

有一个例外:双引号需要转义序列.要逃避双引号,您需要连续放两个双引号.例如,@""""评估为".


@Arun在处理包含正常表达式定义之类的字符串时,它非常有用,这些字符串通常需要自己进行转义
+多行内容
@RichardEverett对于创建多行字符串文字非常有用,而不必将行分成几部分.
你还需要加倍括号`{{`如果你想在`string.Format`调用中使用常规括号.

2> Jon Skeet..:

这是一个逐字字符串文字.这意味着不应用转义.例如:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

在这里verbatim,并regular具有相同的内容.

它还允许多行内容 - 这对SQL来说非常方便:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

逐字字符串文字所必需的一点转义是获得双引号("),你可以通过加倍来实现:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";


它还允许使用保留字作为变量名和东西.像public int GetValueOrDefault(int @default);
Svish:真实但与这个具体问题无关.

3> JulianR..:

"@"也有另一个含义:将它放在变量声明之前允许您使用保留关键字作为变量名.

例如:

string @class = "something";
int @object = 1;

我只发现了一两个合法用途.主要在ASP.NET MVC中,当你想要做这样的事情:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

哪个会生成HTML链接,如:

Text

否则你将不得不使用'Class',它不是保留的关键字,但大写的'C'不符合HTML标准,只是看起来不正确.



4> Konrad Rudol..:

既然你明确要求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字符串连接运算符.+同样可以使用.)



5> Ed Guiness..:

http://msdn.microsoft.com/en-us/library/aa691090.aspx

C#支持两种形式的字符串文字:常规字符串文字和逐字字符串文字.

常规字符串文字由用双引号括起来的零个或多个字符组成,如"hello"中所示,并且可以包括简单转义序列(例如用于制表符的\ t)和十六进制和Unicode转义序列.

逐字字符串文字由@字符后跟双引号字符,零个或多个字符以及结束双引号字符组成.一个简单的例子就是@"你好".在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是quote-escape-sequence.特别是,简单的转义序列和十六进制和Unicode转义序列不会在逐字字符串文字中处理.逐字字符串文字可以跨越多行.



6> Marc Gravell..:

这是一个逐字字符串,并更改转义规则 - 现在转义的唯一字符是",转义为"".这对文件路径和正则表达式特别有用:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

等等



7> aanund..:

从MSDN复制:

在编译时,逐字字符串将转换为具有所有相同转义序列的普通字符串.因此,如果在调试器监视窗口中查看逐字字符串,您将看到编译器添加的转义字符,而不是源代码中的逐字字符.例如,逐字字符串@"C:\files.txt"将在监视窗口中显示为"C:\\files.txt".



8> Presidenten..:

放在@字符串前面使您可以使用特殊字符,如反斜杠或双引号,而无需使用特殊代码或转义字符.

所以你可以写:

string path = @"C:\My path\";

代替:

string path = "C:\\My path\\";

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有