web-dev-qa-db-ja.com

C#の変数名の@文字の使用/意味は何ですか?

C#で「@」文字で変数名を開始できることを発見しました。私のC#プロジェクトでは、Javaで記述されたWebサービスを使用していました(プロジェクトにWeb参照を追加しました)。 WSDLで定義されているインターフェイスオブジェクトの1つに、「params」という名前のメンバー変数がありました。明らかに、これはC#の予約語なので、「params」という名前のメンバー変数を持つクラスを作成することはできません。生成されたプロキシオブジェクトには、次のようなプロパティが含まれていました。

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

VS 2008 c#のドキュメントを検索しましたが、それについて何も見つかりませんでした。また、Googleを検索しても有用な答えは得られませんでした。それでは、変数/プロパティ名の「@」文字の正確な意味または使用は何ですか?

287
Remko Jansen

C#言語仕様識別子(C#) から直接:

接頭辞「@」を使用すると、キーワードを識別子として使用できるようになります。これは、他のプログラミング言語とのインターフェイスに便利です。文字@は実際には識別子の一部ではないため、他の言語では接頭辞なしの通常の識別子として識別子が表示される場合があります。 @プレフィックスが付いた識別子は、逐語的な識別子と呼ばれます。

294
Atif Aziz

予約語を変数名として使用できます。私見はお勧めしません(あなたのような場合を除く)。

70
rslite

C#では、アット(@)文字を使用して、言語仕様の関連規則に明示的に準拠していないリテラルを示します。

具体的には、予約済みのキーワードと競合する変数名に使用できます(たとえば、paramsは使用できませんが、代わりに@paramsを使用できます。言語仕様のout/ref /他のキーワードと同じです)。さらに、エスケープされていない文字列リテラルにも使用できます。これは、特にパス定数に関連しています。の代わりに path = "c:\\temp\\somefile.txt" あなたは書ける path = @"c:\temp\somefile.txt"。正規表現にも非常に便利です。

35
Tomer Gabel

Perlのシギルとは異なり、@ C#の変数名の前の接頭辞には意味がありません。 xが変数の場合、@xは、同じ変数の別の名前です。

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

しかし @接頭辞にはseがあります。これは、C#が違法として拒否する変数名を明確にするために使用できます。

> string string;
Identifier expected; 'string' is a keyword

> string @string;
12
Colonel Panic

@記号を使用すると、変数名に予約済みキーワードを使用できます。好む @int@string@doubleなど.

例えば:

string @public = "Reserved Keyword used for me and its fine";

上記のコードは正常に機能しますが、以下は機能しません。

string public = "This will not compile";
9
Umar Abbas

単に予約語を変数名として使用できます。先日、eventという変数が必要でした。私は_event代わりに、私の同僚は、私はただそれを呼ぶことができると思い出した@event代わりに。

4
Mark Embling

別のユースケースは、拡張メソッドです。最初の特別なパラメーターは、@this名で実際の意味を示すために区別できます。例:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if ([email protected](key))
        {
            return defaultValue;
        }

        return @this[key];
    }
2
BartoszKP

キーワードを識別子の名前として使用すると、コンパイラエラー「識別子が必要です。「識別子名」はキーワードです」を取得します。このエラーを克服するには、識別子の前に「@」を付けます。このような識別子は逐語的な識別子です。文字@は実際には識別子の一部ではないため、他の言語では接頭辞なしの通常の識別子と見なされる場合があります。

1
raji vineeth

次のような変数名として予約済みキーワードを使用するために使用できます

 int @int = 3; 

コンパイラは@を無視し、変数をintとしてコンパイルします

思考を使用することは一般的ではありません

1
Mina Gabriel