【问题标题】:What is the significance of the @ symbol in C sharp? [duplicate]升C中@符号的意义是什么? [复制]
【发布时间】:2011-09-18 19:43:22
【问题描述】:

可能重复:
What's the @ in front of a string for .NET?

我知道使用@ 符号就像是字符串的转义字符。

但是,我有以下行作为将文件存储到映射网络驱动器的路径:

String location = @"\\192.168.2.10\datastore\\" + id + "\\";

上面的工作正常,但现在我想从命令行获取一个字符串,所以我这样做了:

String location = @args[0] + id + "\\";

以上不起作用,似乎我的斜线没有被忽略。这是我的命令:

MyProgram.exe "\\192.168.2.10\datastore\\"

我怎样才能恢复@符号的效果?

【问题讨论】:

  • 你为什么要在你的命令末尾加上两个反斜杠?这不是 C# 语句在做什么。

标签: c# escaping


【解决方案1】:

它用于两件事:

  • 创建“逐字”字符串(忽略转义字符):string path = @"C:\Windows"
  • 转义语言关键字以将它们用作标识符:string @class = "foo"

在您的情况下,您需要这样做:

String location = args[0] + id + @"\\";

【讨论】:

  • 实际上他根本不想要@。第二个字符串在原始版本中没有,因此解析为只有一个反斜杠。
【解决方案2】:

字符串文字前面的 @ 符号告诉编译器忽略和转义字符串中的序列(即以斜杠开头的内容)并“按原样”创建字符串

它也可用于创建名称为保留作品的变量。例如:

int @class=10;

如果你不给 @ 加前缀,那么你会得到一个编译时错误。

你也可以给非保留字的变量添加前缀:

int @foo=22;

请注意,您可以在代码中将变量称为 foo@foo

【讨论】:

    【解决方案3】:

    @前缀表示字符串是文字字符串,转义字符的处理不是由编译器进行的,所以:

    @"\n"
    

    不转换为换行符。没有它,您将拥有:

    String location = "\\\\192.168.2.10\\datastore\\\\" + id + "\\\\";
    

    看起来有点乱。 '@' 整理了一下。 '@' 只能作为字符串常量的前缀,即双引号 (") 内的内容。由于它是编译器指令,它仅在编译时应用,因此必须在编译时知道字符串,因此,

    @some_string_var
    

    不像你想的那样工作。但是,由于所有 '@' 所做的只是停止编译器对转义字符的处理,因此变量中的字符串中已经包含转义字符值('\n' 为 10,13,等等)。例如,如果您想在运行时将 '\n' 转换为 10,13,您需要自己解析它并进行所需的替换(但我相信有人知道更好的方法)。

    要得到你想要的,做:

    String location = args[0] + id + "\\";
    

    【讨论】:

      【解决方案4】:

      @ 符号在 C# 中有两种用途。

      1. 使用引号而不是转义。 "\windows" 可以表示为@"\windows"。 "\"John!\"" 可以表示为@"""John!"""。
      2. 转义变量名(例如使用关键字作为参数名)

        private static void InsertSafe(字符串项,对象@lock) { 锁 (@lock) { mylist.Insert(0,item); } }

      【讨论】:

        【解决方案5】:

        @ 引用的字符串文字以 @ 开头并用双引号括起来。例如:

        @"good morning"  // a string literal
        

        @-quoting 的优点是不处理转义序列,这样写起来很容易,例如完全限定的文件名:

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

        要在 @-quoted 字符串中包含双引号,请将其加倍:

        @"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
        

        @ 符号的另一个用途是使用恰好是 C# 关键字的引用 (/reference) 标识符。有关详细信息,请参阅 2.4.2 标识符。

        http://msdn.microsoft.com/en-us/library/362314fe(v=vs.71).aspx

        【讨论】:

          【解决方案6】:

          在这种情况下,您可能不需要使用@;做吧

          String location = args[0] + id + "\\";
          

          【讨论】:

            【解决方案7】:

            @ 符号仅与代码中的字符串文字相关。变量不应该修改字符串的内容。

            【讨论】:

              【解决方案8】:

              @ 符号就在引号之前。它只适用于字符串文字,它只是改变了编译器理解字符串的方式。它所做的主要事情是导致\ 被解释为文字反斜杠,而不是转义下一个字符。所以你想要:

              String location = args[0] + id + @"\\";
              

              【讨论】:

              • 你比我早了大约 1 秒!删除了我的答案,所以我不会重复它。 :)
              【解决方案9】:

              默认情况下,'\' 字符是 C# 中字符串的转义字符。这意味着如果你想在你的字符串中有一个反斜杠,你需要两个斜杠第一个来转义第二个,如下所示:

              string escaped = "This is a backslash \\";
              //The value of escaped is - This is a backslash \
              

              一个更容易遵循的例子是使用引号:

              string escaped = "To put a \" in a string you need to escape it";
              //The value of escaped is - To put a " in a string you need to escape it
              

              @ 符号相当于“忽略此字符串中的所有转义字符”并逐字声明。如果没有它,您的第一个声明将如下所示:

              "\\\\192.168.2.10\\datastore\\\\" + id + "\\";
              

              请注意,您的第二个字符串上已经没有 @,因此该字符串没有更改并且仍然只包含一个反斜杠。

              你只需要在声明字符串时使用@符号。由于您的论点已经声明,因此不需要。所以你的新行可以是:

              String location = args[0] + id + "\\";
              

              String location = args[0] + id + @"\";
              

              【讨论】:

                【解决方案10】:

                如果您从命令行加载,它已经为您转义了。这就是为什么从你的角度来看你的逃跑被“忽略”了。请注意,从配置加载时也是如此,所以不要这样做:

                <add key="pathToFile" value="C:\\myDirectory\\myFile.txt"/>
                

                如果这样做,您最终会得到双字符串,因为“.NET”足够聪明,可以在您以这种方式加载它们时为您避开细线。

                【讨论】:

                  猜你喜欢
                  • 2011-11-10
                  • 1970-01-01
                  • 2014-08-13
                  • 2019-06-26
                  • 2015-02-13
                  • 1970-01-01
                  • 2011-02-27
                  • 2014-12-06
                  • 2018-01-20
                  相关资源
                  最近更新 更多