Sejak C# 3, var menghilangkan penulisan tipe di sisi kiri; target-typed new dari C# 9 menyelesaikan masalah dari arah berlawanan: tipe di sisi kiri sudah jelas, maka sisi kanan cukup menulis new(). Compiler mengambil tipe dari konteks tujuan, sehingga deklarasi yang panjang seperti Dictionary<string, List<int>> tidak perlu ditulis dua kali. Bab ini memetakan konteks-konteks yang mendukungnya.
Empat Konteks Utama #
- Deklarasi lokal dan field: tipe di sisi kiri menentukan hasil
new(). - Argumen method: tipe diambil dari parameter yang dituju.
- Ekspresi kondisional: kedua cabang
?dan:ditargetkan oleh tipe kiri, sehingga cabang dengan overload berbeda pun dapat ditulis ringkas. - Nilai kembalian dan property: bentuk
=> new()pada anggota dengan return type yang jelas.
Contoh: Keranjang yang Menetap Tipe #
class Keranjang
{
public Dictionary<string, int> Stok { get; } = new();
public List<string> Riwayat { get; } = new(4);
}
static void Terima(Dictionary<string, int> stok, string barang, int jumlah)
{
if (stok.ContainsKey(barang))
{
stok[barang] += jumlah;
}
else
{
stok[barang] = jumlah;
}
}
Keranjang keranjang = new();
Terima(keranjang.Stok, "Kopi", 5);
Terima(keranjang.Stok, "Gula", 3);
Terima(keranjang.Stok, "Kopi", 2);
foreach (KeyValuePair<string, int> pasangan in keranjang.Stok)
{
Console.WriteLine($"{pasangan.Key}: {pasangan.Value}");
}
bool penuh = true;
List<string> daftar = penuh ? new() : new(50);
daftar.Add("Item pertama");
Console.WriteLine(daftar.Count);Output yang Dihasilkan:
Kopi: 7
Gula: 3
1Mari kita bedah baris demi baris:
Keranjang keranjang = new();: tipeKeranjangditulis sekali;new()membentuk instance dengan constructor tanpa parameter.Keranjangdi dalam class: fieldStokdiisinew()danRiwayatdiisinew(4), memilih overload yang menerima kapasitas awal.Terima(keranjang.Stok, ...): method menerimaDictionary<string, int>; pemanggilan bertiga menambah stok hinggaKopiberjumlah7.penuh ? new() : new(50): ekspresi kondisional yang ditargetkanList<string>; kedua cabang diizinkan karena keduanya menghasilkanList<string>.
Batasan #
Array tidak mendukung bentuk new() karena panjangnya tidak dapat dinyatakan; gunakan new[] { ... } atau collection expression [ ... ] dari C# 12. new() juga tidak berlaku ketika konteks tidak memberi tipe target, misalnya argumen method yang di-overload secara ambigu.