Saya mengatur proyek perpustakaan dan saya memiliki kelas manajer pusat bernama Scenegraph
dan sejumlah besar kelas lain yang tinggal di namespace Scenegraph.
Apa yang benar-benar saya inginkan adalah untuk menjadi skenario MyLib.Scenegraph
dan kelas lainnya MyLib.Scenegraph.*
, tetapi tampaknya satu-satunya cara untuk melakukannya adalah dengan membuat semua kelas lain dalam kelas Scenegraph
dalam file Scenegraph.cs dan itu terlalu berat .
Sebaliknya, saya telah mengaturnya sebagai Mylib.Scenegraph.Scenegraph
dan MyLib.Scenegraph.*
, jenis pekerjaan yang mana tetapi saya menemukan Visual Studio menjadi bingung dalam beberapa kondisi, apakah saya merujuk ke kelas atau namespace.
Adakah cara yang baik untuk mengatur paket ini sehingga nyaman bagi pengguna tanpa menyatukan semua kode saya dalam kekacauan yang tidak dapat diperbaiki?
sumber
using Foo.Bar;
kemudianBar b
cukup jelas mengacu padaBar
, kelas (atau enum) di dalam namespaceFoo.Bar
. Alasan sebenarnya untuk tidak melakukannya adalah murni karena compiler C # gagal memahaminya dengan benar, yang sangat mengejutkan dan disayangkan. Ada lagi saran gaya wol.Pemberian nama yang sama ke namespace dan kelas dapat membingungkan compiler seperti yang dikatakan orang lain.
Lalu bagaimana menamainya?
Jika namespace memiliki beberapa kelas, temukan nama yang mendefinisikan semua kelas itu.
Jika namespace hanya memiliki satu kelas (dan karena itu tergoda untuk memberinya nama yang sama) beri nama namespace ClassName NS . Ini adalah bagaimana Microsoft memberi nama pada namespace mereka setidaknya.
sumber
Saya menyarankan agar Anda mengikuti saran yang saya
microsoft.public.dotnet.languages.csharp
gunakanMyLib.ScenegraphUtil.Scenegraph
danMyLib.ScenegraphUtil.*
.sumber
CA1724: Type Names Should Not Match Namespaces
...Pada dasarnya, jika Anda mengikuti Analisis Kode untuk pengkodean yang tepat, aturan ini mengatakan untuk tidak melakukan apa yang Anda coba lakukan. Analisis Kode sangat berguna dalam membantu Anda menemukan potensi masalah.
sumber
Hanya Menambahkan 2 sen saya:
Saya memiliki kelas berikut:
Klien ditulis seperti ini:
Memaafkan kesalahan GetFoo yang tidak mengembalikan output daripada menggunakan parameter out, kompilator tidak dapat menyelesaikan tipe data Foo.Bar []. Itu mengembalikan kesalahan: tidak dapat menemukan jenis atau namespace Foo.Bar.
Tampaknya ketika mencoba untuk mengkompilasinya diselesaikan Foo sebagai kelas dan tidak menemukan Bilah kelas tertanam di kelas Foo. Itu juga tidak dapat menemukan namespace yang disebut Foo.Bar. Gagal mencari bar kelas di namespace Foo. Titik-titik di ruang nama BUKAN sintaksis. Seluruh string adalah token, bukan kata-kata yang dibatasi oleh titik.
Perilaku ini ditunjukkan oleh VS 2015 yang menjalankan .Net 4.6
sumber
Meskipun saya setuju dengan jawaban lain bahwa Anda tidak boleh memberi nama kelas Anda sama dengan namespace Anda ada kalanya Anda tidak dapat memenuhi persyaratan tersebut.
Dalam kasus saya misalnya, saya bukanlah orang yang membuat keputusan seperti itu, oleh karena itu saya perlu menemukan cara untuk membuatnya berhasil.
Jadi bagi mereka yang tidak dapat mengubah nama namespace atau nama kelas di sini adalah cara di mana Anda dapat membuat kode Anda berfungsi.
Pada dasarnya saya membuat namespace "alias" dan yang memungkinkan saya untuk sepenuhnya memenuhi syarat kelas dan "kebingungan" Visual Studio hilang.
CATATAN: Anda harus menghindari konflik penamaan ini jika dalam kendali Anda untuk melakukannya. Anda sebaiknya hanya menggunakan teknik yang disebutkan saat Anda tidak mengontrol kelas dan namespace yang dimaksud.
sumber
Posting lama, tapi di sini saya pergi dengan ide lain yang dapat membantu seseorang:
"... tapi tampaknya satu-satunya cara untuk melakukan itu adalah dengan membuat semua kelas dalam Scenegraph dalam file Scenegraph.cs dan itu terlalu berat."
Ini benar-benar implementasi yang lebih baik untuk sekumpulan skenario. Tapi, saya setuju bahwa memiliki semua kode itu pada file .cs yang sama mengganggu (untuk sedikitnya).
Anda dapat menyelesaikannya dengan membuat kelas dasar sebagai "kelas parsial" dan kemudian, terus membuat kelas dalam pada file mereka sendiri (ingatlah bahwa mereka harus mendeklarasikan pelengkap kelas dasar dan kemudian melanjutkan dengan kelas dalam tertentu untuk file itu).
Sesuatu seperti...
Scenegraph.cs:
DependentClass.cs:
Saya pikir ini adalah semakin dekat Anda bisa mendapatkan implementasi yang bersih dari kelas dalam sementara tidak harus mengacaukan semuanya di dalam satu file besar dan berantakan.
sumber
Seperti yang dikatakan orang lain, merupakan praktik yang baik untuk menghindari penamaan kelas yang sama dengan namespace-nya.
Berikut adalah beberapa saran penamaan tambahan dari jawaban oleh svick untuk pertanyaan terkait "Nama kelas dan namespace yang sama" di Software Engineering Stack Exchange:
(Perhatikan bahwa penggunaan jawaban di atas
Model.DataSource.DataSource
,Model.QueryStorage.QueryStorage.
danModel.Project.Project
sebagai contoh daripadaMyLib.Scenegraph.Scenegraph
.)(Saya juga menemukan saran penamaan lain di jawaban lain di sini bermanfaat.)
sumber
Itu terjadi ketika itu adalah kelas utama namespace. Jadi itu salah satu motivasi untuk meletakkan namespace di perpustakaan, lalu masalahnya hilang jika Anda menambahkan 'Lib' ke nama namespace ...
sumber