Mengapa arahan “using” dan pernyataan “using” menggunakan kata kunci yang sama dalam C #?


10

The usingdirektif memberi kita akses ke jenis tanpa menggunakan nama lengkap memenuhi syarat mereka:

using MyNamespace.Foo.Bar;

The usingpernyataan bertindak sebagai gula sintaksis untuk try/ finallyblok yang memastikan bahwa objek yang dibuang dengan benar:

using(var x = new MyDisposableClass()) { ... }

Kedua situasi ini tampaknya tidak ada hubungannya satu sama lain. Mengapa mereka menggunakan kata kunci yang sama?

Saya ragu ada orang yang akan membuat dua kasus bingung, tetapi tampaknya aneh untuk tidak membuat kata baru untuk bagian fungsionalitas baru.


Sebagai tambahan, saya sudah membaca tentang penggunaan ganda classdalam C ++ juga (satu untuk mendeklarasikan kelas, satu untuk mendefinisikan parameter templat), tetapi kasus kedua akhirnya mendapatkan kata kunci sendiri typename, yang lebih masuk akal bagi saya.

Jawaban:


7

Anda benar karena kedua penggunaan usingtidak terkait.

Namun, ada beberapa alasan bagus untuk digunakan usingdalam kedua kasus tersebut.

  • The usingPernyataan diciptakan untuk NET 1.0 dan masuk akal semantik ( "Saya menggunakan namespace ini dalam kode berikut")
  • Dalam kedua kasus itu, usingmasuk akal semantik. Dalam bahasa Inggris biasa, Anda adalah usingnamespace atau Anda adalah usingobjek sekali pakai yang dinyatakan.
  • Dengan membebani usingkata kunci berlebihan , perancang bahasa tidak perlu membuat kata lain yang dilindungi undang-undang dalam bahasa tersebut. Ini membantu menjaga kebersihan bahasa.

Ada kemungkinan bahwa mengingat waktu mereka lagi, para perancang bahasa mungkin telah memilih untuk menggunakan importdeklarasi namespace untuk memisahkan dua pilihan ( usingobjek sekali pakai datang dalam versi .NET). Kami tidak akan pernah tahu dan itu benar-benar tidak penting karena sangat jelas mana dari dua makna yang Anda gunakan karena konteksnya.

Setelah mengatakan semua itu, jangan pergi dan membuang kode Anda dengan using MyNamespace.DisposableObject = DisposableObject;alias namespace di mana-mana.


Terima kasih. Bisakah Anda memperluas apa yang Anda maksud dengan "membantu menjaga kebersihan bahasa"? Menurut saya, membebani kata kunci membuat bahasa kurang bersih. Saya pikir akan lebih bersih untuk membuat kata kunci baru dan menggunakan kata kunci terpisah untuk fungsi terpisah.
eigenchris

5
Kata kunci tidak dapat digunakan sebagai pengidentifikasi. Memperkenalkan kata kunci baru memecah setiap dan setiap program yang menggunakan kata kunci itu sebagai pengenal. Anda hanya dapat memperkenalkan kata kunci dengan cara yang kompatibel ke belakang jika Anda memiliki akses ke setiap baris kode sumber yang pernah ditulis dalam seluruh sejarah C♯, termasuk kode sumber berpemilik, kode sumber rahasia, kode sumber militer, dan sebagainya.
Jörg W Mittag

@ JörgWMittag, Tidak sepenuhnya benar. C # memiliki sejumlah besar kata kunci kontekstual yang ditambahkan dengan cara yang berarti pengidentifikasi yang ada dengan nama itu tidak bertentangan dengan kode. varmenjadi contoh klasik di mana jenis in-scope bernama vardidahulukan dari kata kunci.
David Arno

@ JörgWMittag Atau alternatifnya adalah membuat versi bahasa dari kompiler dapat dipilih (seperti g++ --std=c++11, atau untuk memungkinkan file sumber untuk menentukan dialek (seperti dalam Haskell (?), Racket, Perl, bahkan Python). Bahasa juga dapat dirancang dalam suatu cara yang kata kunci tidak pernah berbenturan secara sintaksis dengan pengidentifikasi yang mungkin, tanpa memesan beberapa pengidentifikasi (meskipun itu mungkin sulit untuk implementasi bahasa run-off-the-mill Anda menggunakan pengurai LALR dengan pengurai di depan)
amon

1
@eigenchris Anda selalu dapat mendahului keword dengan @ untuk menggunakannya sebagai pengenal seperti@using
Bill Tür

4

Perancang bahasa umumnya mencoba membatasi jumlah kata kunci. Ketika kata kunci dicadangkan, kata kunci tidak dapat digunakan sebagai pengidentifikasi dalam kode pengguna, yang mengganggu jika hanya kata yang Anda butuhkan. Ini juga menjadi penghalang ketika porting kode dari bahasa lain - dan Microsoft ingin orang untuk porting kode dari Jawa ke C #. C # memang memiliki lebih banyak kata kunci daripada Java, tetapi setiap kata kunci baru akan membuatnya lebih sulit. Selain itu, bahasa .net dirancang untuk berinteraksi dengan API yang ditulis dalam berbagai bahasa yang mungkin tidak memiliki kata kunci yang sama, yang menyebabkan gangguan jika anggota publik juga merupakan kata kunci.

Kedua penggunaan usingtidak ambigu, karena mereka muncul di posisi dalam sintaks, "menggunakan" adalah istilah yang tepat dalam kedua kasus. Jadi masuk akal untuk menggunakan kembali kata kunci yang sama. Anda akan mencatat contoh lain penggunaan kembali kata kunci, misalnya:

  • new dalam kendala generik
  • indalam foreachdan dalam parameter tipe varian
  • defaultsebagai klausa switchdan sebagai operator ( default(T)).
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.