Topik ini membahas penulisan namespace modern, yaitu file-scoped namespace yang diperkenalkan C# 10 untuk menghilangkan kurung kurawal pembungkus, beserta direktif using dan global using yang menyingkat daftar nama yang dibawa setiap berkas. Namespace adalah wadah yang mengelompokkan tipe dan mencegah bentrokan nama antarkelas. Setelah topik ini diselesaikan, kelas pendukung diletakkan di dalam namespace dengan cara yang benar, bentuk berkas modern dipahami, dan daftar using diatur sekali untuk seluruh proyek.
Pernyataan tingkat atas dan namespace#
Program yang ditulis dengan top-level statement tinggal di namespace global, yaitu namespace tanpa nama yang menjadi tempat pernyataan tingkat atas. Kelas pendukung tetap dapat diberi namespace bernama dengan menuliskan deklarasinya setelah seluruh pernyataan tingkat atas dalam berkas yang sama. Bentuk ini memisahkan alur program di bagian atas berkas dari tipe pendukung di bagian bawahnya secara jelas.
// Program: pernyataan tingkat atas dan kelas di dalam namespace.
var catatan = new App.Catatan("Beli tinta printer");
catatan.TandaiSelesai();
Console.WriteLine(catatan.Status());
namespace App
{
public class Catatan
{
private bool selesai;
public Catatan(string judul)
{
Judul = judul;
}
public string Judul { get; }
public void TandaiSelesai()
{
selesai = true;
}
public string Status() => selesai ? "Selesai" : "Terbuka";
}
}SelesaiPernyataan tingkat atas memanggil kelas dengan nama lengkapnya App.Catatan, dan keluaran Selesai membuktikan bahwa kelas di dalam namespace dapat dipakai dari pernyataan tingkat atas dalam berkas yang sama. Urutannya juga penting, yaitu pernyataan tingkat atas wajib mendahului deklarasi namespace dan tipe dalam berkas yang sama. Dalam proyek nyata, kelas pendukung umumnya dipisah ke berkas tersendiri, dan bentuk satu berkas ini menjadi pilihan yang nyaman untuk program pendek.
File-scoped namespace#
C# 10 menambahkan bentuk deklarasi namespace yang tidak memakai kurung kurawal, yaitu file-scoped namespace yang ditulis dengan titik koma setelah namanya. Satu berkas memuat tepat satu namespace bentuk ini, dan seluruh isi berkas di bawahnya otomatis menjadi anggota namespace tersebut.
// tidak-dijalankan
// Berkas Catatan.cs dalam sebuah proyek
namespace App;
public class Catatan
{
public string Judul { get; init; } = "";
}Bentuk ini menghemat satu tingkat indentasi pada seluruh berkas, dan penghematannya terlihat pada program di atas yang memakai bentuk berkurung sampai tiga tingkat indentasi di dalam kelasnya. Bentuk berkurung tetap sah dan banyak ditemukan pada kode lama, sedangkan bentuk berkas menjadi pilihan bakunya untuk berkas baru sejak C# 10.
Bentuk berkas ini tidak dapat digabungkan dengan pernyataan tingkat atas dalam satu berkas yang sama. Pernyataan tingkat atas hanya boleh tinggal di namespace global, sehingga deklarasi namespace App; diikuti pernyataan langsung ditolak kompilator (compiler), program yang menerjemahkan kode sumber menjadi program yang dapat dieksekusi, dengan error CS0116. Dengan demikian pembagian perannya jelas, yaitu berkas Program.cs dengan pernyataan tingkat atas tinggal di namespace global, sedangkan setiap berkas tipe pendukung memulai isinya dengan file-scoped namespace. Berkas dengan titik masuk klasik metode Main juga sah memakai bentuk berkas ini, sehingga seluruh berkas proyek dapat diseragamkan.
Using dan ImplicitUsings#
Direktif using membawa tipe dari satu namespace ke dalam jangkauan berkas, sehingga Console dapat ditulis tanpa awalan System. Sejak .NET 6, proyek konsol baru mengaktifkan implicit usings (ImplicitUsings) yang menyuntikkan sekumpulan using bawaan ke seluruh berkas, antara lain System, System.Collections.Generic, System.IO, dan System.Linq. Setelan ini ditulis pada berkas proyek, dan program pada seluruh jalur ini berjalan tanpa using System; justru karena mekanisme tersebut aktif secara bawaan pada dotnet run --file.
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>Apabila kumpulan bawaan itu dimatikan dengan nilai disable, setiap berkas kembali menulis direktif using-nya secara manual seperti kode lama. Nilai enable adalah pilihan bawaan templat dotnet new console, sehingga kode yang dipindahkan dari proyek lama boleh menyederhanakan daftar using-nya bertahap.
Global using#
Global using adalah direktif using yang berlaku untuk seluruh berkas dalam proyek, diperkenalkan bersama C# 10. Direktifnya ditulis dengan kata kunci global di depan, wajib berada sebelum anggota lain pada berkasnya, dan cukup ditulis satu kali di salah satu berkas proyek. Bentuknya sebagai berikut.
// tidak-dijalankan
global using System.Globalization;Setelah direktif tersebut ditulis sekali, tipe seperti CultureInfo dapat dipakai di berkas mana pun tanpa using System.Globalization; per berkas. Cara kedua yang lebih lazim untuk proyek adalah menyatakan daftar namespace global langsung pada berkas proyek, sehingga maksudnya terdokumentasi di satu tempat dan tidak tergantung pada letak direktif di dalam kode.
<ItemGroup>
<Using Include="System.Globalization" />
</ItemGroup>Kedua cara menghasilkan perilaku yang sama, dan setelan pada berkas proyek lebih mudah diaudit karena seluruh nama global terbaca dari satu berkas. Dua mekanisme ini boleh dipadukan, yaitu implicit usings untuk kumpulan bawaan dan global using untuk namespace tambahan yang dipakai merata di proyek.
Kesalahan umum#
- Menulis pernyataan tingkat atas setelah deklarasi namespace. Pernyataan hanya boleh berada di namespace global dan sebelum semua deklarasi tipe, sehingga urutan terbalik ditolak dengan CS0116. Letakkan seluruh pernyataan di bagian atas berkas, atau pindahkan tipe pendukung ke berkas lain.
- Meletakkan
global usingdi tengah berkas. Direktif tersebut wajib mendahului anggota lain pada berkasnya, sehingga letak yang salah ditolak dengan CS1529. Pindahkan ke bagian paling atas berkas, atau nyatakan pada berkas proyek melalui elemenUsing. - Menganggap folder dan namespace wajib identik. Kesesuaian keduanya adalah konvensi yang memudahkan navigasi, bukan keharusan kompilator. Tetap ikuti konvensinya pada proyek nyata, karena penyimpangannya menyulitkan pencarian tipe.
Ringkasan#
- Pernyataan tingkat atas tinggal di namespace global, sedangkan kelas pendukung dideklarasikan di dalam namespace setelah pernyataan dalam berkas yang sama.
- File-scoped namespace dari C# 10 ditulis dengan titik koma, berlaku untuk seluruh isi berkasnya, dan tidak dapat digabungkan dengan pernyataan tingkat atas.
- ImplicitUsings sejak .NET 6 menyuntikkan kumpulan
usingbawaan ke seluruh berkas proyek, sehinggaSystemtidak lagi ditulis manual. - Global using dari C# 10 dideklarasikan dengan kata kunci
globalatau elemenUsingpada berkas proyek, dan berlaku untuk seluruh berkas.
Referensi#
- What’s new in C# 10 — Microsoft Learn — Pengumuman C# 10 yang memperkenalkan file-scoped namespace dan global using.
- namespace keyword — Microsoft Learn
— Referensi kata kunci
namespacedan bentuk deklarasinya. - Using directive — Microsoft Learn
— Dokumentasi direktif
using, termasuk bentukglobal using. - MSBuild project SDK reference — Microsoft Learn
— Daftar properti berkas proyek yang memuat setelan
ImplicitUsings.