Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么是'@';当任何成员变量(即调用函数/属性)不';t影响它的价值?_C#_Asp.net - Fatal编程技术网

C# 为什么是'@';当任何成员变量(即调用函数/属性)不';t影响它的价值?

C# 为什么是'@';当任何成员变量(即调用函数/属性)不';t影响它的价值?,c#,asp.net,C#,Asp.net,我知道如上所述,C#中使用@关键字的目的不同,但我的问题不同 假设我使用@ConfigurationManager.AppSetting[“DbConnectionString”]代替ConfigurationManager.AppSetting[“DbConnectionString”]。它仍然以同样的方式工作 因此,我的问题是: 为什么这里的编译器允许使用“@”符号而不影响其值 “@”符号能否在上述任何情况下更改值 为了更清楚,我想再添加一个示例: 假设我有一个类'Configuration

我知道如上所述,C#中使用@关键字的目的不同,但我的问题不同

假设我使用
@ConfigurationManager.AppSetting[“DbConnectionString”]
代替
ConfigurationManager.AppSetting[“DbConnectionString”]
。它仍然以同样的方式工作

因此,我的问题是:

  • 为什么这里的编译器允许使用“@”符号而不影响其值
  • “@”符号能否在上述任何情况下更改值 为了更清楚,我想再添加一个示例:

    假设我有一个类
    'ConfigurationLoader'
    ,它有一个静态函数
    'GetConfigurations'
    返回字符串列表

    然后,我可以将其称为
    List ConnectionStrs=ConfigurationLoader.GetConfigurations()


    如果我将其设置为
    List ConnectionStrs=@ConfigurationLoader.GetConfigurations()然后它仍然给出相同的结果。在这种情况下,我要问以上两个问题。

    你提到的问题回答了你的问题。在此上下文中,
    @
    告诉编译器下一个符号是标识符,而不是关键字。对于
    ConfigurationManager
    ,您不需要它,但它仍然可以使用。以下是一个需要的示例:

    class @class
    {
        public @class()
        {
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            @class c = new @class();
        }
    }
    

    您可以使用
    @
    符号将保留关键字用作简单变量名,例如:

    int @for = 10;
    
    Console.WriteLine(@for); // 10
    
    同样,您可以使用名为
    @hello
    的变量来代替
    hello
    ,即使
    hello
    不是需要
    @
    前缀才能用作变量名的保留关键字

    编辑以说明不用于保留关键字时允许使用的真正原因

    两个可能的原因:

  • @
    应该只在保留关键字(和转义字符串)上被允许,但是有人忘记了一个
    ,而其他人则不在乎
  • @
    应该被允许在保留的关键字上使用,而且没有人关心它是否也会以其他方式使用

  • 从大量的评论中你可能可以看出,你的问题并没有一个好的、令人满意的答案。不过,我会尝试一下:

    1。在不影响其值的情况下,编译器为什么允许此处使用“@”符号?

    因为语言规范就是这么说的。标记前的@符号并不意味着“下一个标记是关键字,但将其视为标识符”。规范不是这样编写的,因此语言编译器也不是这样工作的。相反,它意味着“无论下一个标记是什么,都要将其视为标识符,即使它恰好是一个关键字”

    这和说“假装蓝色是一种颜色”是一样的。这很容易做到,因为蓝色是一种颜色。类似地,说“假装
    myCollection
    不是C#关键字”很容易——它不是C#关键字,所以没什么可做的

    我想你真正想问的是:

    1b。为什么设计C#的人会这样定义
    @
    符号的行为?

    恐怕只有帮助定义C的人才能回答这个问题。我们可以猜测,答案几乎肯定会是一些人已经评论过的答案:因为这种方式更容易(解释、记录、实现、测试等),而且没有任何负面影响。嗯,除了一些开发人员的一些轻微困惑之外。:)

    在规范中添加一个要求,即编译器在“滥用”
    @
    符号时执行某些操作,这意味着需要做大量的工作。你必须定义它的功能(是警告吗?错误?),你必须向规范中添加正确、准确、校对、明确的语言,你必须向编译器中添加代码以产生新的行为,你必须记录新的行为,你必须编写测试脚本来执行新的行为,等等。所有这些都是为了“功能”这没有任何额外的好处

    它确实使用了@redundant,但由于各种原因,C#允许您做很多冗余的事情。您可以添加冗余的
    ()
    ,您可以添加冗余的委托构造函数,您可以添加冗余的辅助功能关键字。而且,正如您所看到的,如果您愿意,您可以到处添加冗余的
    @

    2。“@”符号能否在上述任何情况下更改值?

    这一个,我们可以回答:不。如果你把
    @
    放在一个已经是标识符的标记之前,它将被视为一个标识符——编译器无论如何都要引用的标识符。你看不到行为上的任何变化,只是额外的输入。

    更新:这个问题是。谢谢你的提问


    “@”符号能否在上述任何情况下更改值

    没有

    我们正在谈论的功能是什么

    在C#中,如果在任何标识符前面加上
    @
    ,则该标识符是允许的,但不要求是关键字。此功能允许开发人员使用保留关键字作为标识符:

    static void M(bool @unsafe) { ... }
    
    它允许您强调,可能与上下文关键字混淆的标识符实际上是一个标识符:

    @yield = 123.45;
    
    如果没有
    @
    ,这将是合法的,但它清楚地表明,开发商的意思不是
    收益率为123.45这里

    那么,为什么不允许在非关键字的标识符上使用它呢

    让我们进入wayback机器,回到C#2.0的世界。假设该功能就是您建议的方式:
    @
    只能用于保留关键字和上下文关键字。你用C#2.0编写这个程序:

    这是一个合法的C#2.0程序,而不是一个合法的C#1程序,这不是有点奇怪吗
    class P
    {
      static void Main()
      {
        int @yield = 123;
      }
    }