Namespace dalam Visual Basic
Namespace mengatur objek yang ditentukan dalam rakitan. Assembly dapat berisi beberapa namespace, yang pada gilirannya dapat berisi namespace layanan lain. Namespace mencegah ambiguitas dan menyederhanakan referensi saat menggunakan grup besar objek seperti pustaka kelas.
Misalnya, .NET Framework menentukan kelas ListBox di namespace System.Windows.Forms. Fragmen kode berikut menunjukkan cara mendeklarasikan variabel menggunakan nama yang sepenuhnya memenuhi syarat untuk kelas ini:
Dim LBox As System.Windows.Forms.ListBox
Menghindari Tabrakan Nama
.NET Framework namespaces mengatasi masalah yang kadang-kadang disebut polusi namespace, di mana pengembang perpustakaan kelas terhambat oleh penggunaan nama yang sama di perpustakaan lain. Konflik dengan komponen yang ada ini terkadang disebut tabrakan nama.
Misalnya, jika Anda membuat kelas baru bernama ListBox
, Anda dapat menggunakannya di dalam proyek Anda tanpa kualifikasi. Namun, jika Anda ingin menggunakan kelas .NET Framework ListBox dalam proyek yang sama, Anda harus menggunakan referensi yang sepenuhnya memenuhi syarat untuk membuat referensi unik. Jika referensi tidak unik, Visual Basic menghasilkan kesalahan yang menyatakan bahwa namanya ambigu. Contoh kode berikut menunjukkan cara mendeklarasikan objek ini:
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox
Ilustrasi berikut menunjukkan dua hierarki namespace, keduanya berisi objek bernama ListBox
:
Secara default, setiap file yang dapat dieksekusi yang Anda buat dengan Visual Basic berisi namespace dengan nama yang sama dengan proyek Anda. Misalnya, jika Anda menentukan objek dalam proyek bernama ListBoxProject
, file yang dapat dieksekusi ListBoxProject.exe berisi namespace yang disebut ListBoxProject
.
Beberapa rakitan dapat menggunakan namespace yang sama. Visual Basic memperlakukannya sebagai satu set nama. Misalnya, Anda dapat menentukan kelas untuk namespace layanan yang disebut SomeNameSpace
dalam rakitan bernama Assemb1
, dan menentukan kelas tambahan untuk namespace yang sama dari perakitan bernama Assemb2
.
Nama yang Sepenuhnya Memenuhi Syarat
Nama yang sepenuhnya memenuhi syarat adalah referensi objek yang diawali dengan nama namespace tempat objek ditentukan. Anda dapat menggunakan objek yang ditentukan dalam proyek lain jika Anda membuat referensi ke kelas (dengan memilih Tambahkan Referensi dari menu Project) lalu menggunakan nama yang sepenuhnya memenuhi syarat untuk objek dalam kode Anda. Fragmen kode berikut menunjukkan cara menggunakan nama yang sepenuhnya memenuhi syarat untuk objek dari namespace proyek lain:
Dim LBC As New ListBoxProject.Form1.ListBox
Nama yang sepenuhnya memenuhi syarat mencegah konflik penamaan karena memungkinkan pengkompilasi untuk menentukan objek mana yang sedang digunakan. Namun, nama-nama itu sendiri bisa menjadi panjang dan rumit. Untuk mengatasi hal ini, Anda dapat menggunakan pernyataan Imports
untuk menentukan alias—nama singkatan yang dapat Anda gunakan sebagai pengganti nama yang sepenuhnya memenuhi syarat. Misalnya, contoh kode berikut membuat alias untuk dua nama yang sepenuhnya memenuhi syarat, dan menggunakan alias ini untuk menentukan dua objek.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
Jika Anda menggunakan pernyataan tanpa alias Imports
, Anda dapat menggunakan semua nama di namespace tersebut tanpa kualifikasi, asalkan unik untuk proyek. Jika proyek Anda berisi pernyataan Imports
untuk namespace yang berisi item dengan nama yang sama, Anda harus sepenuhnya memenuhi syarat nama tersebut saat menggunakannya. Diibaratkan, sebagai contoh, proyek Anda berisi dua pernyataan Imports
berikut:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Jika Anda mencoba untuk menggunakan Class1
tanpa sepenuhnya memenuhi syarat, Visual Basic menghasilkan kesalahan yang menyatakan bahwa nama Class1
tersebut ambigu.
Pernyataan Tingkat Namespace
Dalam namespace, Anda dapat menentukan item seperti modul, antarmuka, kelas, delegasi, enumerasi, struktur, dan namespace lainnya. Anda tidak dapat menentukan item seperti properti, prosedur, variabel, dan peristiwa di tingkat namespace. Item ini harus dideklarasikan dalam kontainer seperti modul, struktur, atau kelas.
Kata Kunci Global dalam Nama yang Sepenuhnya Memenuhi Syarat
Jika Anda telah menentukan hierarki namespace berlapis, kode di dalam hierarki System tersebut mungkin diblokir agar tidak mengakses namespace layanan .NET Framework. Contoh berikut mengilustrasikan hierarki di mana namespace SpecialSpace.System
memblokir akses ke System.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
Akibatnya, pengkompilasi Visual Basic tidak dapat berhasil menyelesaikan referensi ke System.Int32, karena SpecialSpace.System
tidak menentukan Int32
. Anda dapat menggunakan kata kunci Global
untuk memulai rantai kualifikasi di tingkat terluar pustaka kelas .NET Framework. Ini memungkinkan Anda menentukan namespace System atau namespace lainnya di pustaka kelas. Contoh berikut mengilustrasikan langkah-langkah ini:
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
Anda dapat menggunakan Global
untuk mengakses namespace tingkat akar lainnya, seperti Microsoft.VisualBasic, dan namespace apa pun yang terkait dengan proyek Anda.
Kata Kunci Global dalam Pernyataan Namespace
Anda juga dapat menggunakan kata kunci Global
dalam Pernyataan Namespace. Ini memungkinkan Anda menentukan namespace dari namespace akar proyek Anda.
Semua namespace dalam proyek Anda didasarkan pada namespace layanan akar untuk proyek. Visual Studio menetapkan nama proyek Anda sebagai namespace akar default untuk semua kode dalam proyek Anda. Misalnya, jika proyek Anda diberi nama ConsoleApplication1
, elemen pemrogramannya milik namespace ConsoleApplication1
. Jika Anda menyatakan Namespace Magnetosphere
, referensi ke Magnetosphere
dalam proyek akan mengakses ConsoleApplication1.Magnetosphere
.
Contoh berikut menggunakan kata kunci Global
untuk mendeklarasikan namespace di luar namespace layanan akar untuk proyek.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
Dalam deklarasi namespace, Global
tidak dapat ditumpuk di namespace layanan lain.
Anda dapat menggunakan Halaman Aplikasi, Project Designer (Visual Basic) untuk melihat dan mengubah Namespace Layanan Akar proyek. Untuk proyek baru, Namespace Layanan Akar default ke nama proyek. Untuk menyebabkan Global
menjadi namespace tingkat atas, Anda dapat menghapus entri Namespace Layanan Akar sehingga kotak kosong. Membersihkan Namespace Layanan Akar menghapus kebutuhan akan kata kunci Global
dalam deklarasi namespace.
Jika pernyataan Namespace
mendeklarasikan nama yang juga merupakan namespace layanan dalam .NET Framework, namespace .NET Framework menjadi tidak tersedia jika kata kunci Global
tidak digunakan dalam nama yang sepenuhnya memenuhi syarat. Untuk mengaktifkan akses ke namespace .NET Framework tersebut tanpa menggunakan kata kunci Global
, Anda dapat menyertakan kata kunci Global
dalam pernyataan Namespace
.
Contoh berikut memiliki kata kunci Global
dalam deklarasi namespace System.Text
.
Jika kata kunci Global
tidak ada dalam deklarasi namespace, StringBuilder tidak dapat diakses tanpa menentukan Global.System.Text.StringBuilder
. Untuk proyek bernama ConsoleApplication1
, referensi akan System.Text
mengakses ConsoleApplication1.System.Text
jika kata kunci Global
tidak digunakan.
Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding
' If the namespace defined below is System.Text
' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module
Namespace Global.System.Text
Class TitanEncoding
End Class
End Namespace