Saya memiliki latar belakang C ++ dan saya sepenuhnya memahami dan setuju dengan jawaban atas pertanyaan ini: Mengapa “menggunakan namespace std;” dianggap praktik yang buruk?
Jadi saya heran bahwa, setelah memiliki pengalaman dengan C # sekarang, saya melihat kebalikannya di sana:
using Some.Namespace;
secara harfiah digunakan di mana-mana. Setiap kali Anda mulai menggunakan suatu tipe, Anda menambahkan direktif penggunaan untuk namespace-nya terlebih dahulu (jika belum ada di sana). Saya tidak ingat pernah melihat file .cs
-file yang tidak dimulai dengan using System; using System.Collections.Generic; using X.Y.Z; etc...
. Bahkan, jika Anda menambahkan file baru melalui wizard Visual Studio, secara otomatis menambahkan beberapa menggunakan arahan di sana, meskipun Anda mungkin tidak membutuhkannya sama sekali. Jadi, sementara di komunitas C ++ Anda pada dasarnya digantung, C # bahkan mendorong untuk melakukan ini. Setidaknya begini tampilannya bagiku.
Sekarang, saya mengerti bahwa menggunakan arahan dalam C # dan C ++ tidak persis sama. Juga, saya mengerti bahwa salah satu hal paling using namespace
jahat yang dapat Anda lakukan di C ++, yaitu meletakkannya di file header, tidak memiliki padanan yang jahat di C # karena kurangnya konsep file header dan #include
.
Namun, terlepas dari perbedaan mereka, menggunakan arahan dalam C # dan C ++ melayani tujuan yang sama, yang hanya harus mengetik SomeType
sepanjang waktu, daripada yang lebih lama Some.Namespace.SomeType
(dalam C ++ dengan ::
alih - alih .
). Dan dengan tujuan yang sama ini, bahaya juga tampak sama bagi saya: penamaan tabrakan.
Dalam kasus terbaik ini menghasilkan kesalahan kompilasi, jadi Anda "hanya" harus memperbaikinya. Dalam kasus terburuk, masih dikompilasi dan kode diam-diam melakukan hal-hal yang berbeda dari yang Anda inginkan. Jadi pertanyaan saya adalah: Mengapa (tampaknya) menggunakan arahan yang dianggap sangat buruk di C # dan C ++?
Namun, beberapa ide jawaban yang saya miliki (tidak satupun yang benar-benar memuaskan saya):
Ruang nama cenderung jauh lebih lama dan lebih banyak bersarang di C # daripada di C ++ (
std
vs.System.Collection.Generic
). Jadi, ada lebih banyak keinginan dan lebih banyak keuntungan dalam menghilangkan kode dengan cara ini. Tetapi bahkan jika ini benar, argumen ini hanya berlaku ketika kita melihat ruang nama standar. Yang khusus dapat memiliki nama pendek apa pun yang Anda suka, baik dalam C # dan C ++.Ruang nama tampaknya jauh lebih "butiran halus" di C # daripada di C ++. Sebagai contoh, di C ++ seluruh perpustakaan standar terkandung dalam
std
(ditambah beberapa ruang nama bersarang kecil sepertichrono
) sementara di C # Anda memilikiSystem.IO
,System.Threading
,System.Text
dll Jadi, risiko memiliki tabrakan penamaan lebih kecil. Namun, ini hanya firasat. Sebenarnya saya tidak menghitung berapa banyak nama yang Anda "impor" denganusing namespace std
danusing System
. Dan lagi, bahkan jika ini benar, argumen ini hanya berlaku ketika melihat ruang nama standar. Yang Anda miliki sendiri dapat dirancang sebagai butiran halus sesuai keinginan, baik dalam C # maupun C ++.
Apakah ada lebih banyak argumen? Saya terutama tertarik pada fakta-fakta nyata yang sebenarnya (jika ada) dan tidak begitu banyak pendapat.
sumber
Ext(this T t, long l)
yang dipanggil viat.Ext(0)
. Jika Anda kemudian menambahkan namespace lain yang berisi metode ekstensiExt(this T t, int i)
, yang itu akan dipanggil. Tapi saya bukan ahli C # (belum).Jawaban:
"menggunakan Sistem;" adalah tidak universal tidak dianggap sebagai praktek yang buruk. Lihat misalnya: Mengapa Anda tidak menggunakan arahan 'using' di C #?
Tapi itu mungkin benar bahwa itu tidak dianggap cukup sebagai buruk sebagai
using namespace std
. Mungkin karena:C # tidak memiliki file header. Tidak umum untuk "memasukkan" satu file sumber C # ke yang lain menggunakan pra-prosesor.
std
namespace hampir datar yaitu hampir semua fungsi perpustakaan standar, jenis dan variabel ada di dalamnya (ada beberapa pengecualian seperti sub-namespace filesystem). Ini berisi jumlah pengidentifikasi yang sangat, sangat tinggi. Menurut pemahaman saya,System
mengandung jauh lebih sedikit nama, dan sebagai gantinya memiliki lebih banyak sub-ruang nama.Dalam C #, tidak ada fungsi atau variabel global. Dengan demikian, jumlah pengidentifikasi global biasanya cukup kecil berbeda dengan C ++ yang memang memiliki itu: Lebih jauh, biasanya menggunakan perpustakaan C (sering secara tidak langsung) yang tidak memiliki ruang nama, dan karenanya menempatkan semua nama mereka ke dalam global namespace.
Sejauh yang saya tahu, C # tidak memiliki pencarian berdasarkan argumen. ADL bersamaan dengan penyembunyian nama, kelebihan beban, dll. Dapat menghasilkan kasus di mana beberapa program tidak terpengaruh oleh konflik nama, sementara yang lain terpengaruh secara halus, dan menangkap semua kasus sudut tidak layak dengan pengujian.
Karena perbedaan-perbedaan ini, "menggunakan Sistem;" memiliki kemungkinan konflik nama yang lebih rendah daripada
using namespace std
.Juga, namespace "mengimpor" dengan cara tertentu, sebuah konvensi yang berkelanjutan: Jika konvensional untuk mengimpor namespace standar, maka programmer secara konvensional akan mencoba untuk menghindari memilih nama dari namespace itu untuk pengidentifikasi mereka sendiri, yang membantu mengurangi masalah dengan konvensi semacam itu.
Jika impor semacam itu dianggap praktik yang buruk, maka programmer akan cenderung untuk mencoba menghindari konflik dengan ruang nama yang diimpor. Dengan demikian, konvensi cenderung dipolarisasi baik untuk atau melawan praktik, bahkan jika bobot argumen antara pilihan pada awalnya halus.
sumber
std::
). Dalam C #, ini jauh lebih banyak (System.
memiliki "hanya" 7 karakter, tetapi ruang nama bersarang lainnya memiliki lebih banyak karakter, dan menuliskannya di mana-mana akan membuat kode benar-benar tidak dapat dibaca).std::
), bukankah itu gaya yang umum digunakanusing Sys = System;
sebagai ganti namespace yang mencemari non-aliasusing
?Ya, tetapi Anda tidak mengekspor bahaya itu (baca: memaksa orang lain menghadapinya), karena:
Jadi ini adalah kategori yang berbeda.
Juga, C ++ tidak "dirancang" untuk dikembangkan dalam IDE seperti halnya C #. C # pada dasarnya selalu ditulis dalam Visual Studio dengan Intellisense dan yang lainnya. Ini dirancang untuk digunakan seperti itu, oleh orang-orang yang membuatnya. Terlepas dari berapa banyak orang menggunakan IDE untuk dikembangkan di C ++, itu tidak dirancang dengan kasus penggunaan itu sebagai masalah besar.
Ya itu juga.
using namespace std
danusing System.Collection.Generic
tidak ada bandingannya.Jadi jangan bandingkan mereka!
sumber
using namespace std
dalam C ++ kebanyakan tentang file header. Jawabannya adalah ini tidak berlaku dalam C #.using namespace std
tentu saja bukan tentang header. Menggunakannya di header berbahaya. Menggunakannya dalam implementasi Anda disarankan.using namespace ...
dalam c ++ adalah tentang menghindari penamaan tabrakan,using
arahan dalam C # memperkenalkan kemungkinan penamaan tabrakan juga, lalu mengapa tidak menghindarinya? Meski ada implementasinya berbeda.using
deklarasi C # adalah per file yang mendefinisikan tipe / kelas tunggal dan tipe biasanya berkaitan dengan serangkaian konsep domain aplikasi yang relatif sempit (idealnya, prinsip tanggung jawab tunggal) probabilitas bentrokan namespace tersebut sangat rendah. Tetapi ketika terjadi mudah diperbaiki. Alat pengembangan .NET umum / IDE banyak membantu Anda dengan itu. Pertimbangkan seluruh ekosistem pengembangan yang dirancang untuk membuat Anda lebih produktif dengan menggabungkan yang terbaik dari berbagai kegiatan pengembangan