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


298

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を検索しても、有用な答えは得られませんでした。それでは、変数/プロパティ名の「@」文字の正確な意味または使用法は何ですか?

回答:


306

ストレートからC#言語仕様識別子(C#の)

接頭辞 "@"を使用すると、識別子としてキーワードを使用できるようになります。これは、他のプログラミング言語とやり取りするときに役立ちます。文字@は実際には識別子の一部ではないため、識別子は他の言語では接頭辞なしの通常の識別子と見なされる場合があります。@接頭辞が付いた識別子は、逐語的識別子と呼ばれます。


2
対象となる.NETの最小バージョンは何をサポートしてい@ますか?
serhio 2010

16
.NET自体は@このようなシンボルを定義していませんが、C#言語仕様は定義しています。これは、最初のバージョンであるC#1.0(.NET 1.0とともにリリースされた)以降、これをサポートしています。csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.

9
そして不思議に思う人のために、VB.NETでは[ ]、逐語的識別子を指定するために使用できますDim [String] As String
マイクロウイルス2014

74

予約語を変数名として使用できます。IMHOはお勧めしません(お持ちの場合を除いて)。


6
@rslite:+1非推奨:)
user7116 '18

4
> 決して +1推奨されませんが、決して言わないでください。たとえば、C#キーワードを識別子として使用するレガシーCOMインターフェイスを実装する必要がある場合があります。またはマイクロソフトは、フレームワークの新しいバージョンに新しいキーワードを導入する可能性があります。たとえば、.NET 1.1ボンドトレーディングアプリの利回り:)
Joe

2
@Joe:新しいyieldキーワードは予約語ではなく、合法的に識別子を表示できないコンテキストでのみ使用できます。C#の新機能を設計するときの1つの目標は、新機能が追加される前に合法であったプログラムが、その後合法であり、同じ意味を持つようにそれらを構築することです。
スーパーキャット2013

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )これは、HTMLを手動で記述したり、JavaScriptで後から属性を変更したりしなければ、うまく回避できない良い例です。
2014年

オープンソースソフトウェアに見られる新しい傾向があり、C#コードではすべての変数の先頭に「@」記号が付いています。これは、PHPソフトウェアの変数に関するこの要件に精通しているためと考えられます。そして、多くのオープンソースWebシステムがC#でコーディングされています(以前はPHP
でした

36

C#では、アットマーク(@)は、言語仕様の関連ルールに明示的に準拠していないリテラルを示すために使用されます。

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


規則が「逐語的」または「ヒア文字列パラメータの命名の間で同じであるという興味深い点(および便利なニーモニック)。
ルフィン

13

Perlのシギルとは異なり@、C#の変数名の前のプレフィックスは意味がありません。場合はx変数であり、@x同じ変数の別の名前です。

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

しかし、あなたが発見@したように、接頭辞には用途があります -それを使用して、C#が違法として拒否する変数名を明確にすることができます。

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

> string @string;

10

@シンボルは、変数名のために予約されたキーワードを使用することができます。以下のような@int@string@doubleなど

例えば:

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

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

string public = "This will not compile";

4

予約語を変数名として使用できるようにするだけです。event先日呼ばれたvarが欲しかった。私は_event代わりに行くつもりでしたが、私の同僚は私が@event代わりにそれを呼び出すことができることを思い出させました。


3

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

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

1

識別子の名前としてキーワードを使用すると、「識別子が必要です。 '識別子名'がキーワードです」というコンパイラエラーが発生します。このエラーを解決するには、識別子の前に「@」を付けます。そのような識別子は逐語的な識別子です。文字@は実際には識別子の一部ではないため、識別子は他の言語では接頭辞なしの通常の識別子として表示される可能性があります


1

これを使用して、予約キーワードを変数名として使用できます。

 int @int = 3; 

コンパイラはを無視し@、変数を次のようにコンパイルしますint

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.