10

hereで説明されているように、「@」キーワードがC#でさまざまな目的に使用されていることは知っていますが、私の質問は異なります。

@ConfigurationManager.AppSetting["DbConnectionString"]の代わりに使用しているとしConfigurationManager.AppSetting["DbConnectionString"]ます。それは今でも同じように機能します。

だから私の質問は:

  1. '@' 記号がその値に影響を与えないのに、ここでコンパイラによって許可されるのはなぜですか?
  2. 上記のように、「@」記号はどのシナリオでも値を変更できますか?

より明確にするために、もう1つ追加したいと思います例:

文字列のリストを返す'ConfigurationLoader'静的関数を持つクラスがあるとします。'GetConfigurations'

それから、私はそれを と呼ぶことができますList<string> ConnectionStrs=ConfigurationLoader.GetConfigurations();

私がそれを作ってもList<string> ConnectionStrs=@ConfigurationLoader.GetConfigurations();、それでも同じ結果が得られます。そのようなシナリオで、私は上記の 2 つの質問をしています。

4

4 に答える 4

24

更新: この質問は、2013 年 9 月の私のブログの主題でした。素晴らしい質問をありがとう!


上記のように、「@」記号はどのシナリオでも値を変更できますか?

いいえ。

私たちが話している機能は何ですか?

C# では、識別子の前に を付けると@、その識別子は許可されますが、キーワードである必要はありません。この機能により、開発者は予約済みのキーワードを識別子として使用できます。

static void M(bool @unsafe) { ... }

また、コンテキスト キーワードと混同される可能性のある識別子が実際には識別子であることを強調できます。

@yield = 123.45;

がなくても合法@ですが、開発者がここで意図していないことは明らかyield return 123.45;です。

では、なぜキーワードではない識別子で許可されているのでしょうか?

ウェイバック マシンに入り、C# 2.0 の世界に戻りましょう。機能があなたが提案した方法であったとしましょう:予約済みのコンテキスト キーワードにのみ@使用できます。このプログラムは C# 2.0 で記述します。

class P
{
  static void Main()
  {
    int @yield = 123;
  }
}

C# 2.0 の機能をまったく使用していないにもかかわらず、これが合法的なC# 2.0プログラムであり、合法的な C# 1.0 プログラムではないというのは、少し奇妙に思えませんか?

設計された機能により、異なるバージョンの C#を使用している 2 つのチーム間でコードを共有できます。また、チームの 1 人にC# 2.0 を試してもらい、他の全員がまだ C# 1.0 を使用している間に、C# 2.0 が機能するかどうかを確認することができます。あなたが提案した機能は、これらのシナリオの両方を悪夢のようなものにし、言語の新しいバージョンの採用に対する障壁をもたらします。アップグレードにはすでに十分な費用がかかります。言語設計チームは、これ以上コストがかかることを望んでいません。

設計された機能は、「将来の証明」も可能にします。他のプログラムを生成するプログラムを書いているとします。C# の将来のバージョンでどの単語がキーワードになるかわからないため、生成されたプログラムのすべての識別子の前に を付けたほうがよいでしょう。@

C# のキーワード ルールの詳細はどこで確認できますか?

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

于 2013-06-04T15:54:42.160 に答える