请问--- C#里,变量前的@符号是什么意思?

时间:2021-08-08 21:18:25
比如下面这段,编译没问题,但不知道加@和不加有什么区别?

int @Left = 0;
            @Left = @Left = 1;
            @Left = Left;
            Left = @Left;

41 个解决方案

#1


个人喜好。如果是在字符串前加@表示后面的字符串按常量解析
@"c:\windows"
不加的话应该为"c:\\windows"

#2


个人认为 @ 不使用在字符串常量前面 即使通过编译 也没有任何意义

#3


在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


class @class
{
   public static void @static(bool @bool) {
      if (@bool)
         System.Console.WriteLine("true");
      else
         System.Console.WriteLine("false");
   }   
}
class Class1
{
   static void M() {
      cl\u0061ss.st\u0061tic(true);
   }
}
注意,@ 虽然出现在标识符中,但不作为标识符本身的一部分。
因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

这样,对于跨语言的移植带来了便利。因为,某个单词在 C#  中作为保留关键字,但是在其他语言中也许不是。

#4


没有用过
学习下
关注

#5


一 字符串中的用法

1。地球人都知道 C# 中 字符串常量可以以 @ 开头声名,这样的优点是转义序列“不”被处理,按“原样”输出,即我们不需要对转义字符加上 \ (反斜扛),就可以轻松coding。如,

string filePath = @"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"


2。如要在一个用 @ 引起来的字符串中包括一个双引号,就需要使用两对双引号了。
这时候你不能使用 \ 来转义爽引号了,因为在这里 \ 的转义用途已经被 @  “屏蔽”掉了。如,

@"""Ahoy!"" cried the captain."    // 输出为: "Ahoy!" cried the captain.


有点像SQL中的单引号常量处理方式:

DECLARE @msg varchar(100)
SET @msg = ''Ahoy!'' cried the captain.'  -- 输出为: 'Ahoy!' cried the captain.


3。@ 会识别换行符
其实这个特性,我不知道怎么描述,只是偶然发现的,先看下面的代码吧:

        string script = @"
            <script type=""type/javascript"">
            function doSomething()
            {
            }
            </script>";
安逸吧,在cs文件中写js,结构就很清晰了,正常情况我们是这样coding的:

string script2 = 
            "<script type=\"type/javascript\">function doSomething(){}</script>";

// or

string script3 =
            "<script type=\"type/javascript\">" +
            "function doSomething(){ " +
            "}</script>";
通常我们会选择后者,因为js代码一般比较长,或者方法体很大,或者需要连接其他变量,这样结构比较清晰。

注意:如果“拼接”的次数很多,应该考虑使用StringBuilder了,有助于提高性能。

还有一种场景,也很常见,在程序中拼接 SQL 语句,如

private const string SQL_INS_USER = @"
            INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";
哈哈,这样就像写存储过程一般,保持相当高的代码清晰度。

然而,我们需要关注一个问题:字符串长度

看下面的测试代码:

        private const string SQL_INS_USER1 = @"
            INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";

        private const string SQL_INS_USER2 = @"INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";

        private const string SQL_INS_USER3 = @"INSERT INTO t_User([UserName], [Password], Email) VALUES(@UserName, @Password, @Email)"; 

        static void Main(string[] args)
        {
            Console.WriteLine(SQL_INS_USER1.Length);    //  126 
            Console.WriteLine(SQL_INS_USER2.Length);    //  112
            Console.WriteLine(SQL_INS_USER3.Length);    //  86
        }

可以看到三个字符串长度分别相差了,14=126-112和26=112-86,注意观察了,在代码编辑器中,SQL_INS_USER1 中第一个换行符号之后,我缩进13个空格(INSERT之前),而
SQL_INS_USER2 中第一个换行符号之后,我缩进25个空格(VALUES之前),
那么,加上一个换行符,刚刚好 14和26

My GOD!

如此编写代码,虽然提高了代码的清晰度和简便性,却无行中带来了另一个问题:字符长度!
很多场景下我们希望字符串越短越好,如,通过ADO.NET 发送 SQL 语句给数据库执行。
所以还是慎用之!


二 标识符中的用法

在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


class @class
{
   public static void @static(bool @bool) {
      if (@bool)
         System.Console.WriteLine("true");
      else
         System.Console.WriteLine("false");
   }   
}
class Class1
{
   static void M() {
      cl\u0061ss.st\u0061tic(true);
   }
}
注意,@ 虽然出现在标识符中,但不作为标识符本身的一部分。
因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

这样,对于跨语言的移植带来了便利。因为,某个单词在 C#  中作为保留关键字,但是在其他语言中也许不是。

具体见

C# Language Specification
2.4.2 Identifiers
http://msdn.microsoft.com/zh-cn/library/aa664670(VS.71).aspx

#6


1.用于文件路径(最常用的)
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。
class @class 
  { 
  public static void @static(bool @bool) { 
  if (@bool) 
  System.Console.WriteLine("true"); 
  else 
  System.Console.WriteLine("false"); 
  } 
  } 
  class Class1 
  { 
  static void M() { 
  clu0061ss.stu0061tic(true); 
  } 
  }

因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

#7


俺的回复转自。。。。

晓风残月

#8


HDNGO的回复够详细了

#9


以前看过的 忘了 汗
mark下
1.用于文件路径(最常用的) 
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码 
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。 

转自6楼,说我侵权,小心我丢鸡蛋给你,9楼砸6楼...

#10


学习~

#11


@转义字符
SQL:@定义变量

#12


引用 3 楼 HDNGO 的回复:
在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


C# codeclass@class
{publicstaticvoid@static(bool@bool) {if(@bool)
         System.Console.WriteLine("true");elseSystem.Console.WriteLine("false");
   }   
}classClass1
{staticvoidM() {
      cl\u0061ss.st\u0061tic(true);
   }
}注意,@ 虽然出现在标识符中,但不作为标识符本身的…

顶,c# Language Specification上的例子

#13


高手真多,
我来简单说一句:
加@就是告诉 编译器 这是本人定义的变量名字,不是其他什么东西!!

假如有个人就是喜欢 用 class 当变量名,但是编译器 就是要把class当关键字 怎么办????
那就在class前加@就可以了,

#14


晕, 手太快了。 都回复这么多人了。 

#15


我一般都是用于写路径什么的时候让转义字符无效的,看完帖才知道这么多作用啊

#16


@ C#的转义字符

#17


1.用于文件路径(最常用的) 
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码 
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。

#18


引用 8 楼 ojlovecd 的回复:
HDNGO的回复够详细了


顶一下,学习   本来就知道@可以用在转义符上

#19


不错,讲全了.

#20


学习

#21


以允许C# 中保留关键字作为自己定义的标识符。 

#22


敢问,各位看帮助文档了么?
《MSDN Library for Visual Studio 2008 简体中文》


如果有的话请看:C#关键字  一节



关键字是对编译器具有特殊意义的预定义保留标识符。
它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。

#23


@就是反斜杠的一个转义,
例如:@"D:\a" 等同于"D:\\a"

#24


长见识了~

#25


up 

#26


是一种标识吧   也可以当作转义字符来看

#27


3楼回复的很详细

#28


在需要转义的字符串前面加@

#29


学习了,up一下,嘿嘿

#30


学习了

#31


xuexi

#32


有些关键字,你不能直接作为标识符来用
你要想用这些关键字作为自己定义的标识符,只要加@就可以了,用来区别系统关键字

#33


好详细。

#34


强调 不是引用而以

#35


深刻学习来了。

#36


参数

#37


没有用过 
学习下 
关注

#38


引用 10 楼 yangxuefei7 的回复:
学习~


PS: 
我的目标是 ---->  请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?

^_^

#39


该回复于2009-02-18 13:13:32被版主删除

#40


总结来看,@的意思是:后面这部分是爷自个儿的,编译器大叔你靠边站。

#41


收场了 不错 谢谢 

#1


个人喜好。如果是在字符串前加@表示后面的字符串按常量解析
@"c:\windows"
不加的话应该为"c:\\windows"

#2


个人认为 @ 不使用在字符串常量前面 即使通过编译 也没有任何意义

#3


在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


class @class
{
   public static void @static(bool @bool) {
      if (@bool)
         System.Console.WriteLine("true");
      else
         System.Console.WriteLine("false");
   }   
}
class Class1
{
   static void M() {
      cl\u0061ss.st\u0061tic(true);
   }
}
注意,@ 虽然出现在标识符中,但不作为标识符本身的一部分。
因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

这样,对于跨语言的移植带来了便利。因为,某个单词在 C#  中作为保留关键字,但是在其他语言中也许不是。

#4


没有用过
学习下
关注

#5


一 字符串中的用法

1。地球人都知道 C# 中 字符串常量可以以 @ 开头声名,这样的优点是转义序列“不”被处理,按“原样”输出,即我们不需要对转义字符加上 \ (反斜扛),就可以轻松coding。如,

string filePath = @"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"


2。如要在一个用 @ 引起来的字符串中包括一个双引号,就需要使用两对双引号了。
这时候你不能使用 \ 来转义爽引号了,因为在这里 \ 的转义用途已经被 @  “屏蔽”掉了。如,

@"""Ahoy!"" cried the captain."    // 输出为: "Ahoy!" cried the captain.


有点像SQL中的单引号常量处理方式:

DECLARE @msg varchar(100)
SET @msg = ''Ahoy!'' cried the captain.'  -- 输出为: 'Ahoy!' cried the captain.


3。@ 会识别换行符
其实这个特性,我不知道怎么描述,只是偶然发现的,先看下面的代码吧:

        string script = @"
            <script type=""type/javascript"">
            function doSomething()
            {
            }
            </script>";
安逸吧,在cs文件中写js,结构就很清晰了,正常情况我们是这样coding的:

string script2 = 
            "<script type=\"type/javascript\">function doSomething(){}</script>";

// or

string script3 =
            "<script type=\"type/javascript\">" +
            "function doSomething(){ " +
            "}</script>";
通常我们会选择后者,因为js代码一般比较长,或者方法体很大,或者需要连接其他变量,这样结构比较清晰。

注意:如果“拼接”的次数很多,应该考虑使用StringBuilder了,有助于提高性能。

还有一种场景,也很常见,在程序中拼接 SQL 语句,如

private const string SQL_INS_USER = @"
            INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";
哈哈,这样就像写存储过程一般,保持相当高的代码清晰度。

然而,我们需要关注一个问题:字符串长度

看下面的测试代码:

        private const string SQL_INS_USER1 = @"
            INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";

        private const string SQL_INS_USER2 = @"INSERT INTO t_User([UserName], [Password], Email) 
                        VALUES(@UserName, @Password, @Email)";

        private const string SQL_INS_USER3 = @"INSERT INTO t_User([UserName], [Password], Email) VALUES(@UserName, @Password, @Email)"; 

        static void Main(string[] args)
        {
            Console.WriteLine(SQL_INS_USER1.Length);    //  126 
            Console.WriteLine(SQL_INS_USER2.Length);    //  112
            Console.WriteLine(SQL_INS_USER3.Length);    //  86
        }

可以看到三个字符串长度分别相差了,14=126-112和26=112-86,注意观察了,在代码编辑器中,SQL_INS_USER1 中第一个换行符号之后,我缩进13个空格(INSERT之前),而
SQL_INS_USER2 中第一个换行符号之后,我缩进25个空格(VALUES之前),
那么,加上一个换行符,刚刚好 14和26

My GOD!

如此编写代码,虽然提高了代码的清晰度和简便性,却无行中带来了另一个问题:字符长度!
很多场景下我们希望字符串越短越好,如,通过ADO.NET 发送 SQL 语句给数据库执行。
所以还是慎用之!


二 标识符中的用法

在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


class @class
{
   public static void @static(bool @bool) {
      if (@bool)
         System.Console.WriteLine("true");
      else
         System.Console.WriteLine("false");
   }   
}
class Class1
{
   static void M() {
      cl\u0061ss.st\u0061tic(true);
   }
}
注意,@ 虽然出现在标识符中,但不作为标识符本身的一部分。
因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

这样,对于跨语言的移植带来了便利。因为,某个单词在 C#  中作为保留关键字,但是在其他语言中也许不是。

具体见

C# Language Specification
2.4.2 Identifiers
http://msdn.microsoft.com/zh-cn/library/aa664670(VS.71).aspx

#6


1.用于文件路径(最常用的)
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。
class @class 
  { 
  public static void @static(bool @bool) { 
  if (@bool) 
  System.Console.WriteLine("true"); 
  else 
  System.Console.WriteLine("false"); 
  } 
  } 
  class Class1 
  { 
  static void M() { 
  clu0061ss.stu0061tic(true); 
  } 
  }

因此,以上示例,定义了一个名为 class 的类,并包含一个名为 static 的方法,以及一个参数名为了 bool 的形参。

#7


俺的回复转自。。。。

晓风残月

#8


HDNGO的回复够详细了

#9


以前看过的 忘了 汗
mark下
1.用于文件路径(最常用的) 
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码 
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。 

转自6楼,说我侵权,小心我丢鸡蛋给你,9楼砸6楼...

#10


学习~

#11


@转义字符
SQL:@定义变量

#12


引用 3 楼 HDNGO 的回复:
在 C#  规范中, @  可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。


C# codeclass@class
{publicstaticvoid@static(bool@bool) {if(@bool)
         System.Console.WriteLine("true");elseSystem.Console.WriteLine("false");
   }   
}classClass1
{staticvoidM() {
      cl\u0061ss.st\u0061tic(true);
   }
}注意,@ 虽然出现在标识符中,但不作为标识符本身的…

顶,c# Language Specification上的例子

#13


高手真多,
我来简单说一句:
加@就是告诉 编译器 这是本人定义的变量名字,不是其他什么东西!!

假如有个人就是喜欢 用 class 当变量名,但是编译器 就是要把class当关键字 怎么办????
那就在class前加@就可以了,

#14


晕, 手太快了。 都回复这么多人了。 

#15


我一般都是用于写路径什么的时候让转义字符无效的,看完帖才知道这么多作用啊

#16


@ C#的转义字符

#17


1.用于文件路径(最常用的) 
2.用@表示的字符串能够跨越数行。用于在CS中写JS或SQL代码 
3.@ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。

#18


引用 8 楼 ojlovecd 的回复:
HDNGO的回复够详细了


顶一下,学习   本来就知道@可以用在转义符上

#19


不错,讲全了.

#20


学习

#21


以允许C# 中保留关键字作为自己定义的标识符。 

#22


敢问,各位看帮助文档了么?
《MSDN Library for Visual Studio 2008 简体中文》


如果有的话请看:C#关键字  一节



关键字是对编译器具有特殊意义的预定义保留标识符。
它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。

#23


@就是反斜杠的一个转义,
例如:@"D:\a" 等同于"D:\\a"

#24


长见识了~

#25


up 

#26


是一种标识吧   也可以当作转义字符来看

#27


3楼回复的很详细

#28


在需要转义的字符串前面加@

#29


学习了,up一下,嘿嘿

#30


学习了

#31


xuexi

#32


有些关键字,你不能直接作为标识符来用
你要想用这些关键字作为自己定义的标识符,只要加@就可以了,用来区别系统关键字

#33


好详细。

#34


强调 不是引用而以

#35


深刻学习来了。

#36


参数

#37


没有用过 
学习下 
关注

#38


引用 10 楼 yangxuefei7 的回复:
学习~


PS: 
我的目标是 ---->  请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?请问--- C#里,变量前的@符号是什么意思?

^_^

#39


该回复于2009-02-18 13:13:32被版主删除

#40


总结来看,@的意思是:后面这部分是爷自个儿的,编译器大叔你靠边站。

#41


收场了 不错 谢谢