Bukankah var
kata kunci di C #? Tetapi mengapa saya bisa melakukan ini:
public class var { }
public class main
{
public static void main(string[] args)
{
var testVar = new var();
}
}
Yang var
digunakan dalam kode adalah var
kelas yang dideklarasikan sebelum main
kelas tersebut. Dan kompilator bahkan tidak mengeluh.
Sedangkan saat saya melakukan ini:
public class int { }
atau ini:
public class true { }
Kompilator mengatakan itu int
atau true
adalah kata kunci dan tidak dapat digunakan seperti itu. Kenapa tidak sama dengan var
?
var var = "var";
dengan metode. Bagaimanapun, ini hari Jumat.Jawaban:
var
bukan kata kunci menurut daftar ini .ini adalah kata kunci kontekstual, jadi dari konteksnya kompilator dapat memutuskan mana kelas Anda dan mana yang merupakan kata kunci kontekstual, dan tidak ada kebingungan yang muncul.
kata kunci kontekstualnya adalah:
agar tidak dicadangkan, Anda dapat menggunakannya.
Seperti yang ditunjukkan pada komentar di atas terdapat pembahasan tentang perbedaan serta daftar berbagai kata kunci dan kata kunci kontekstual yang ditambahkan pada setiap versi c # di blog Eric Lipperts
Menarik untuk dicatat bahwa sejak kumpulan kata kunci diputuskan di C # 1.0 tidak ada tambahan, untuk menjaga kompatibilitas ke belakang.
sumber
Contextual Keyword
. "Kata kunci kontekstual digunakan untuk memberikan arti tertentu dalam kode, tetapi ini bukan kata yang dipesan di C # . Beberapa kata kunci kontekstual, seperti parsial dan di mana, memiliki arti khusus dalam dua atau lebih konteks."var
maka tidak semuanya rusak saat meningkatkan C #.Kompiler cukup pintar untuk mengetahui bahwa konteks yang Anda gunakan
var
sebagai nama kelas tidak pernah menjadi konteks untuk kata kunci sehingga memungkinkannya (itulah sebabnya ia didefinisikan sebagai kata kunci kontekstual ).sumber
var
akan digunakan sebagai kata kunci dalam kode sepertivar testVar = new var();
. Ya, konteksnya, dalam hal apakah tipe kustom bernamavar
telah ditentukan, berperan di dalamnya, tetapi justru karena kompiler tidak cukup pintar dalam kasus tersebut untuk mengetahui apakahvar testVar
merujuk ke kelasvar
atau ke kata kuncivar
yang defaultnya ke kelas dalam konteks seperti itu. Jikavar
kata kunci dinamai berbeda, kata kunci dapat digunakan dalam "konteks" yang sama.add
- di sini, kompilator memang tahu di setiap kejadian apakah kata kunci itu dimaksudkan (deklarasi acara; pengenal tidak akan masuk akal di sana), atau apakah kode tersebut merujuk ke pengenal (tipe atau nama dalam deklarasi, penggunaan pengenal dalam tubuh metode; kata kunci tidak akan masuk akal di sana).Cara lain untuk melihat ini: "var" sebagai kata kunci tidak ada di versi pertama C # (tidak seperti "int" dan "true"), jadi Anda mungkin telah menulis beberapa kode yang saat itu memiliki kelas yang disebut "var". Ini baik-baik saja dan legal. Kemudian ketika "var" ditambahkan ke bahasa, para desainer dengan baik hati membuatnya menjadi kata kunci hanya dalam konteks tertentu, sehingga kelas var Anda yang ada akan tetap berfungsi.
Ini adalah salah satu tantangan nyata dalam desain bahasa - cara menambahkan fitur baru tanpa merusak kode yang ada, dan tanpa membuat fitur baru menjadi rumit untuk digunakan.
sumber
Dalam versi C # sebelum versi 3, variabel lokal yang diketik secara implisit belum didukung, jadi
var
tidak memiliki arti khusus dan dimungkinkan untuk mendefinisikan variabel dan kelas yang dinamaivar
. Program contoh Anda legal, karena kedua kejadianvar
dimain
merujuk ke kelasvar
.C # 3 dan versi yang lebih baru kompatibel ke bawah, jadi kode yang ditulis dalam C # sebelum versi 3 masih dikompilasi dengan kompiler baru.
int
dantrue
merupakan kata kunci sejak C # 1.sumber
Kata kunci dapat dipesan secara kontekstual. Ketika kode sumber diurai, konteks tersebut ditetapkan sebagai bagian dari pohon parse. Evaluasi kata kunci terjadi dalam konteks itu. Jadi, dalam kasus ini, var tidak berada dalam konteks yang dicadangkan dan tidak akan memiliki arti yang sama seperti saat Anda menggunakannya dalam pernyataan tugas. Saya percaya salah satu alasan untuk fleksibilitas ini adalah karena var diperkenalkan di C # 3, jadi membuatnya dicadangkan di mana-mana mungkin telah merusak kompatibilitas mundur di beberapa program, sedangkan menggunakannya sebagai deklarasi tipe variabel tidak akan dikompilasi di versi sebelumnya, jadi tidak ada kerusakan.
sumber