Apakah dianggap praktik yang dapat diterima untuk menggunakan Modul, bukan Kelas dengan fungsi Anggota bersama di VB.NET?
Saya cenderung menghindari Modul, karena mereka merasa seperti sisa-sisa sisa dari Visual Basic 6.0 dan sepertinya tidak cocok lagi. Di sisi lain, sepertinya tidak ada banyak perbedaan antara menggunakan Modul dan Kelas dengan hanya anggota yang Dibagikan. Tidak sering saya benar-benar membutuhkan banyak hal, tetapi kadang-kadang ada situasi di mana mereka menghadirkan solusi sederhana.
Saya ingin tahu apakah Anda memiliki pendapat atau preferensi apa pun.
Private
kualifikasi secara eksplisit . Di kelas, tingkat perlindungan default adalah privat, yang bisa membingungkan perilaku kecuali Anda menyadarinya.Jawaban:
Module
s adalah mitra VB kestatic
kelas C # . Ketika kelas Anda dirancang hanya untuk fungsi pembantu dan metode ekstensi dan Anda tidak ingin mengizinkan pewarisan dan instantiasi , Anda menggunakan aModule
.Ngomong-ngomong, menggunakan
Module
tidak benar-benar subyektif dan itu tidak ditinggalkan . Memang Anda harus menggunakanModule
saat yang tepat. .NET Framework sendiri melakukannya berkali-kali (System.Linq.Enumerable
, misalnya). Untuk mendeklarasikan metode ekstensi, harus menggunakanModule
s.sumber
Saya pikir itu ide yang baik untuk terus menghindari modul kecuali Anda memasukkannya ke ruang nama yang terpisah. Karena dalam metode Intellisense dalam modul akan terlihat dari mana-mana di namespace itu.
Jadi alih-alih
ModuleName.MyMethod()
Anda berakhir denganMyMethod()
sembulan di mana saja dan jenis enapsulasi enapsulasi ini. (setidaknya di level pemrograman).Itu sebabnya saya selalu mencoba membuat Kelas dengan metode bersama, tampaknya jauh lebih baik.
sumber
Modul sama sekali tidak ditinggalkan dan banyak digunakan dalam bahasa VB. Ini satu-satunya cara misalnya untuk menerapkan metode ekstensi di VB.Net.
Ada satu perbedaan besar antara Modul dan Kelas dengan Anggota Statis. Setiap metode yang didefinisikan pada Modul dapat diakses secara global selama Modul tersedia di namespace saat ini. Akibatnya, Modul memungkinkan Anda untuk menentukan metode global. Ini adalah sesuatu yang tidak bisa dilakukan oleh kelas dengan anggota bersama.
Berikut adalah contoh cepat yang saya gunakan banyak ketika menulis kode VB yang berhenti dengan antarmuka COM mentah.
sumber
Dapat diterima untuk digunakan
Module
.Module
tidak digunakan sebagai penggantiClass
.Module
melayani tujuannya sendiri. TujuannyaModule
adalah untuk digunakan sebagai wadah untukClass
, atauClass
.Module
tidak sepertiClass
karena kamu tidak bisaModule
,Interface
denganModule
,Module
.Apa pun di dalam a
Module
dapat langsung diakses di dalamModule
majelis tanpa merujuk padaModule
namanya. Secara default, tingkat akses untuk aModule
adalahFriend
.sumber
Kelas
Modul
sumber
Ketika salah satu kelas VB.NET saya memiliki semua anggota yang dibagikan, saya mengonversinya menjadi Modul dengan namespace yang cocok (atau jika tidak sesuai) atau saya membuat kelas tidak dapat diwarisi dan tidak dapat dibangun:
sumber
Imports <whatever>
jika Anda memiliki impor apapun,Namespace MyCoolModule
,Public Module MyCoolModule
, <anggota tanpaShared
>,End Module
,End Namespace
.Modul baik untuk menyimpan enum dan beberapa variabel global, konstanta dan fungsi bersama. itu hal yang sangat bagus dan saya sering menggunakannya. Variabel yang dideklarasikan adalah acros yang terlihat seluruh proyek.
sumber
Anda harus menggunakan Modul (bukan Kelas) jika Anda membuat metode Extension. Di VB.NET saya tidak mengetahui opsi lain.
Menjadi resisten terhadap Modul sendiri, saya hanya menghabiskan beberapa jam tidak berharga mencoba untuk mencari tahu bagaimana menambahkan beberapa kode boilerplate untuk menyelesaikan rakitan tertanam dalam satu, hanya untuk mengetahui bahwa
Sub New()
(Modul) danShared Sub New()
(Kelas) adalah setara. (Aku bahkan tidak tahu ada adalah sebuah callableSub New()
dalam Modul!)Jadi saya hanya melempar
EmbeddedAssembly.Load
danAddHandler AppDomain.CurrentDomain.AssemblyResolve
garis di sana dan Bob menjadi paman saya.Tambahan : Saya belum memeriksanya 100%, tetapi saya memiliki firasat yang
Sub New()
berjalan dalam urutan berbeda dalam Modul daripada Kelas, hanya berdasarkan fakta bahwa saya harus memindahkan beberapa deklarasi ke metode dalam dari luar untuk menghindari kesalahan.sumber