Setiap tipe di .NET punya nama lengkap yang terdiri dari namespace dan nama tipenya: System.Console, System.Collections.Generic.List<T>, System.Text.StringBuilder. Namespace mengelompokkan tipe-tipe yang berhubungan dan mencegah nama saling bentrok, jadi class Order atau Timer buatanmu bisa hidup berdampingan dengan class bernama sama dari library. Directive using di bagian atas file meng-import sebuah namespace supaya kamu bisa memakai nama pendeknya.
Output:
Cart: tea, honey
1
Directive using hanya memengaruhi nama saat compile. Directive ini tidak memuat library atau menambahkan kode ke program; library mana yang tersedia ditentukan oleh referensi proyek dan package NuGet. Kalau compiler melaporkan bahwa sebuah tipe atau namespace "could not be found (are you missing a using directive or an assembly reference?)", error CS0246, berarti baris using-nya tidak ada atau package-nya belum direferensikan.
Mendeklarasikan namespace sendiri
Taruh tipe di dalam blok namespace. Namespace bisa bersarang, ditulis dengan titik, dan namespace yang sama bisa tersebar di banyak file.
Output:
120.00 via DHL
Shop.Billing.Invoice
namespace Shop.Billing { } adalah cara singkat untuk namespace Shop { namespace Billing { } }. Kode di dalam Shop bisa merujuk ke Billing.Invoice tanpa awalan Shop., karena nama dicari terlebih dahulu di namespace-namespace yang membungkusnya.
Konvensinya: mulai dengan nama perusahaan atau produk (Contoso.Payments), lalu fitur atau lapisannya, dan sesuaikan dengan struktur folder (Contoso.Payments/Refunds/RefundService.cs berisi Contoso.Payments.Refunds). Jangan pernah memberi class nama yang sama dengan namespace-nya (Shop.Shop), karena itu memaksa penulisan nama lengkap yang canggung di mana-mana.
Alias
using Name = Namespace.Type; memberi sebuah tipe (atau namespace) nama lokal. Ada dua situasi yang membutuhkannya: memperpendek tipe generik yang panjang, dan mengatasi bentrok nama.
Output:
latte: 3.60
order 17
Alias hanya berlaku untuk file tempat ia dideklarasikan (kecuali alias itu global, lihat di bawah). Di C# 12 ke atas, alias bisa menamai tipe apa pun, termasuk tuple dan array: using Point = (int X, int Y);.
Referensi ambigu (CS0104)
Saat dua namespace yang di-import berisi tipe dengan nama yang sama, memakai nama pendeknya adalah error. Kasus klasiknya adalah Timer, yang ada di System.Threading, System.Timers dan (di aplikasi desktop) System.Windows.Forms:
using System.Threading;
using System.Timers;
var t = new Timer(1000);
// error CS0104: 'Timer' is an ambiguous reference between
// 'System.Timers.Timer' and 'System.Threading.Timer'
Ada tiga solusi, dari yang paling lokal sampai yang paling luas: tulis nama lengkapnya (new System.Timers.Timer(1000)), tambahkan alias yang menyatakan mana yang kamu maksud, atau hapus directive yang tidak kamu butuhkan.
Output:
250
System.Timers.Timer
System.Threading.Timer
Kalau namespace-mu sendiri mendefinisikan tipe bernama System atau Console, awalan global:: memaksa pencarian dimulai dari akar: global::System.Console.WriteLine("hi");. Kode yang dibuat otomatis memakainya di mana-mana karena alasan itu.
using static
using static meng-import member static dari satu tipe, jadi member itu bisa dipanggil tanpa nama tipenya. Fitur ini cocok untuk kode yang memanggil class yang sama berulang-ulang, seperti Math:
Output:
Area: 28.27
Hypotenuse: 5
42
using static juga bekerja dengan enum (using static System.DayOfWeek; membuatmu bisa menulis Monday) dan dengan static class buatanmu sendiri. Pakai di tempat nama-nama pendeknya tetap tidak ambigu; WriteLine saja di sebuah file besar bisa membuat pembaca bertanya-tanya penulis mana yang dimaksud.
global using dan file-scoped namespace (C# 10)
Dua fitur C# 10 mengurangi kode berulang di bagian atas file. Global using berlaku untuk setiap file di proyek, dan biasanya disimpan di satu file seperti GlobalUsings.cs:
// GlobalUsings.cs, C# 10 and later
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using Money = System.Decimal;
Proyek SDK di .NET 6 ke atas bisa membuatkannya untukmu. Dengan <ImplicitUsings>enable</ImplicitUsings> di .csproj (default di template baru), proyek console mendapat System, System.Collections.Generic, System.IO, System.Linq, System.Net.Http, System.Threading dan System.Threading.Tasks; proyek web juga mendapat namespace ASP.NET Core. Itulah sebabnya file Program.cs modern langsung dimulai dengan kode.
File-scoped namespace mendeklarasikan namespace untuk seluruh file dengan titik koma, bukan dengan blok, sehingga menghemat satu tingkat indentasi:
// C# 10 and later
namespace Shop.Billing;
public class Invoice
{
public decimal Amount { get; set; }
}
Sebuah file hanya boleh punya satu file-scoped namespace, dan bentuk ini tidak bisa dicampur dengan namespace berbentuk blok di file yang sama. Proyek lama, script Unity dan kode yang menargetkan .NET Framework memakai bentuk blok yang ditunjukkan sebelumnya.
Tempat directive using, dan pernyataan using
Directive using harus ditulis sebelum deklarasi namespace atau tipe apa pun di dalam file (global using sebelum semua yang lain). Directive ini juga bisa ditaruh di dalam blok namespace, dan dalam hal itu hanya berlaku di sana; panduan gaya berbeda-beda, dan sebagian besar kode .NET menaruhnya di bagian atas.
Kata kunci using punya tugas kedua yang tidak berhubungan di dalam method: pernyataan using using (var file = File.OpenRead(path)) { ... } memanggil Dispose pada objek saat bloknya berakhir, sehingga file dan koneksi ditutup. Keduanya hanya berbagi kata kunci, tidak lebih. Lihat halaman pernyataan using.
Pertanyaan yang sering diajukan
Apa yang dilakukan using di C#?
Di bagian atas file, using System.Text; adalah directive yang meng-import sebuah namespace, jadi kamu bisa menulis StringBuilder, bukan System.Text.StringBuilder. Directive ini tidak menambahkan kode dan tidak memuat apa pun; ia hanya memperpendek nama. Di dalam method, using (var f = ...) adalah fitur yang berbeda, yaitu pernyataan using, yang melakukan dispose pada sebuah objek di akhir blok.
Apa itu namespace di C#?
Namespace adalah kelompok tipe bernama yang mencegah bentrok nama dan mengatur kode, seperti System.Collections.Generic atau MyShop.Billing. Dua class bisa memakai nama yang sama kalau berada di namespace yang berbeda. Menurut kebiasaan, namespace mengikuti struktur folder dan diawali nama perusahaan atau produk.
Apa itu using static di C#?
using static System.Math; meng-import member static dari satu tipe, jadi kamu bisa memanggil Sqrt(16) dan membaca PI tanpa awalan Math.. Fitur ini bekerja dengan class apa pun, termasuk class buatanmu sendiri dan enum. Pakai di tempat nama-nama pendeknya tetap jelas, seperti kode yang banyak berisi perhitungan matematika.
Bagaimana cara memperbaiki "is an ambiguous reference" di C#?
Error CS0104 berarti dua namespace yang di-import sama-sama berisi tipe dengan nama tersebut, misalnya Timer di System.Threading dan System.Timers. Tulis nama lengkapnya (System.Timers.Timer), hapus salah satu directive using, atau tambahkan alias: using Timer = System.Timers.Timer;.
Apa itu global using di C#?
global using System.Text; (C# 10) meng-import sebuah namespace untuk setiap file di proyek, bukan hanya file tempat ia ditulis. Proyek SDK .NET 6 ke atas membuatkan sekumpulan global using secara otomatis saat <ImplicitUsings>enable</ImplicitUsings> diatur, itulah sebabnya file Program.cs yang baru tidak punya baris using.