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 #

csharp
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:

text
Kopi: 7
Gula: 3
1

Mari kita bedah baris demi baris:

  1. Keranjang keranjang = new();: tipe Keranjang ditulis sekali; new() membentuk instance dengan constructor tanpa parameter.
  2. Keranjang di dalam class: field Stok diisi new() dan Riwayat diisi new(4), memilih overload yang menerima kapasitas awal.
  3. Terima(keranjang.Stok, ...): method menerima Dictionary<string, int>; pemanggilan bertiga menambah stok hingga Kopi berjumlah 7.
  4. penuh ? new() : new(50): ekspresi kondisional yang ditargetkan List<string>; kedua cabang diizinkan karena keduanya menghasilkan List<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.