Apa gunanya / arti dari karakter @ dalam nama variabel di C #?

298

Saya menemukan bahwa Anda dapat memulai nama variabel Anda dengan karakter '@' di C #. Dalam proyek C # saya, saya menggunakan layanan web (saya menambahkan referensi web ke proyek saya) yang ditulis dalam Java. Salah satu objek antarmuka yang didefinisikan dalam WSDL memiliki variabel anggota dengan nama "params". Jelas ini adalah kata yang dilindungi undang-undang di C # sehingga Anda tidak dapat memiliki kelas dengan variabel anggota dengan nama "params". Objek proxy yang dihasilkan berisi properti yang terlihat seperti ini:

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

Saya mencari melalui dokumentasi VS 2008 c # tetapi tidak dapat menemukan apa-apa tentang itu. Pencarian Google juga tidak memberi saya jawaban yang berguna. Jadi apa arti sebenarnya atau penggunaan karakter '@' dalam nama variabel / properti?

Remko Jansen
sumber

Jawaban:

306

Langsung dari Spesifikasi Bahasa C # , Pengidentifikasi (C #) :

Awalan "@" memungkinkan penggunaan kata kunci sebagai pengidentifikasi, yang berguna saat berinteraksi dengan bahasa pemrograman lain. Karakter @ sebenarnya bukan bagian dari pengidentifikasi, sehingga pengidentifikasi dapat dilihat dalam bahasa lain sebagai pengidentifikasi normal, tanpa awalan. Pengidentifikasi dengan awalan @ disebut pengidentifikasi kata demi kata.

Atif Aziz
sumber
2
apa versi minimal yang ditargetkan dari dukungan .NET @?
serhio
16
.NET itu sendiri tidak mendefinisikan @simbol seperti ini, spesifikasi bahasa C # tidak. Ini telah mendukung ini sejak versi pertamanya, C # 1.0 (dirilis dengan .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
9
Dan bagi mereka yang bertanya-tanya, dalam VB.NET Anda dapat menggunakan [ ]untuk menentukan pengidentifikasi kata demi kata, mis Dim [String] As String.
MicroVirus
74

Itu hanya memungkinkan Anda menggunakan kata yang dipesan sebagai nama variabel. Tidak direkomendasikan IMHO (kecuali dalam kasus seperti yang Anda miliki).

rslite
sumber
6
@rslite: +1 Tidak disarankan :)
user7116
4
> tidak pernah +1 Tidak direkomendasikan, tetapi tidak pernah mengatakan tidak pernah. Misalnya, Anda mungkin perlu mengimplementasikan antarmuka COM lawas yang menggunakan kata kunci C # sebagai pengidentifikasi. Atau Microsoft dapat memperkenalkan kata kunci baru dalam versi baru Kerangka ini - misalnya menghasilkan dalam aplikasi perdagangan .NET 1.1 Obligasi :)
Joe
2
@ Jo: Kata yieldkunci baru bukan kata yang dilindungi undang-undang, dan hanya dapat digunakan pada konteks di mana tidak ada pengidentifikasi yang dapat muncul secara legal . Salah satu tujuan ketika merancang fitur baru untuk C # adalah membangunnya sedemikian rupa sehingga program apa pun yang akan legal sebelum fitur baru ditambahkan akan sah setelahnya dan memiliki arti yang sama .
supercat
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )adalah contoh yang baik di mana Anda tidak dapat benar-benar menyiasatinya tanpa harus menulis HTML secara manual, atau meminta javascript mengubah atribut pada tahap selanjutnya.
Flater
Ada tren baru yang terlihat pada perangkat lunak Open Source di mana semua variabel diawali dengan simbol "@" dalam kode C #. Saya percaya ini mungkin karena keakraban persyaratan ini dalam perangkat lunak PHP untuk variabel. Dan banyak sistem web Open Source sekarang dikodekan dalam C # (di mana dulu adalah PHP)
Wasted_Coder
36

Dalam C # the at (@) karakter digunakan untuk menunjukkan literal yang secara eksplisit tidak mematuhi aturan yang relevan dalam spesifikasi bahasa.

Khususnya, ini dapat digunakan untuk nama variabel yang berbenturan dengan kata kunci yang dipesan (mis. Anda tidak dapat menggunakan params tetapi Anda dapat menggunakan @params, sama dengan out / ref / kata kunci lain dalam spesifikasi bahasa). Selain itu dapat digunakan untuk string literal yang tidak terhindar; ini sangat relevan dengan konstanta path, misalnya alih-alih path = "c:\\temp\\somefile.txt"Anda dapat menulis path = @"c:\temp\somefile.txt". Ini juga sangat berguna untuk ekspresi reguler.

Tomer Gabel
sumber
Poin menarik (dan mnemonik yang bermanfaat) bahwa konvensi itu sama antara "kata demi kata" atau " string di sini " dan penamaan parameter.
ruffin
13

Tidak seperti sigils Perl, @awalan sebelum nama variabel di C # tidak memiliki arti. Jika xvariabel, @xadalah nama lain untuk variabel yang sama.

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

Tetapi @awalan memang memiliki kegunaan , seperti yang Anda temukan - Anda dapat menggunakannya untuk mengklarifikasi nama variabel yang C # akan ditolak sebagai ilegal.

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

> string @string;
Kolonel Panic
sumber
10

The @simbol memungkinkan Anda untuk menggunakan kata kunci yang disediakan untuk nama variabel. seperti @int, @string, @doubledll

Sebagai contoh:

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

Kode di atas berfungsi dengan baik, tetapi di bawah ini tidak akan berfungsi:

string public = "This will not compile";
Umar Abbas
sumber
4

Ini hanya memungkinkan Anda untuk menggunakan kata-kata yang dipesan sebagai nama variabel. Saya ingin var menelepon eventhari lain. Saya akan pergi dengan _eventsebagai gantinya, tetapi rekan saya mengingatkan saya bahwa saya bisa menyebutnya begitu@event .

Tandai Embling
sumber
3

Kasus penggunaan lain adalah metode ekstensi. Parameter pertama dan khusus dapat dibedakan untuk menunjukkan arti sebenarnya dengan @thisnama. Sebuah contoh:

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

        return @this[key];
    }
BartoszKP
sumber
1

Jika kami menggunakan kata kunci sebagai nama untuk pengenal, kami mendapatkan kesalahan kompiler "pengidentifikasi diharapkan, 'Nama Pengidentifikasi' adalah kata kunci" Untuk mengatasi kesalahan ini, awali pengenal dengan "@". Pengidentifikasi seperti itu adalah pengidentifikasi kata demi kata. Karakter @ sebenarnya bukan bagian dari pengidentifikasi, sehingga pengidentifikasi dapat dilihat dalam bahasa lain sebagai pengidentifikasi normal, tanpa awalan

raji vineeth
sumber
1

Anda dapat menggunakannya untuk menggunakan kata kunci yang dipesan sebagai nama variabel suka

 int @int = 3; 

kompiler akan mengabaikan @dan mengkompilasi variabel sebagaiint

itu bukan praktik umum untuk menggunakan pikiran

Mina Gabriel
sumber