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.
Ext(this T t, long l)
yang dipanggil via t.Ext(0)
. Jika Anda kemudian menambahkan namespace lain yang berisi metode ekstensi Ext(this T t, int i)
, yang itu akan dipanggil. Tapi saya bukan ahli C # (belum).