Menu

Variabel C#: var, const, readonly, Scope, dan Penamaan

Cara mendeklarasikan dan mengisi variabel di C#, kapan var cocok dipakai dan kapan tidak, cara kerja scope, perbedaan const, readonly dan static readonly, konvensi penamaan, serta error variabel yang belum diisi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Variabel adalah tempat penyimpanan bernama dengan tipe yang tetap. Di C#, kamu mendeklarasikannya dengan tipe dan nama, dan boleh langsung memberinya nilai di pernyataan yang sama. Tipenya tidak pernah berubah setelah itu: variabel int menyimpan bilangan bulat selama variabel itu ada.

Output:

Priya bought 5 items for 20.25
10

Mengisi variabel dengan nilai bertipe salah adalah error kompilasi: quantity = "five"; gagal dengan CS0029 (cannot implicitly convert type 'string' to 'int'). Konversi antartipe dilakukan secara eksplisit; lihat konversi tipe.

var: membiarkan compiler menyimpulkan tipe

var mendeklarasikan variabel lokal yang tipenya disimpulkan dari nilai awalnya. Ini bukan dynamic typing: tipenya sudah tetap saat kompilasi, persis seolah kamu menuliskannya sendiri.

Output:

String
Int32
Decimal
Double
List`1

var punya tiga aturan. Ia hanya berlaku untuk variabel lokal (bukan field atau parameter). Variabelnya harus diberi nilai awal di deklarasi: var x; adalah error CS0818, "Implicitly-typed variables must be initialized". Dan nilai awalnya harus punya tipe: var nothing = null; tidak bisa dikompilasi, karena null saja tidak punya tipe.

Kapan memakainya adalah soal gaya tim. Pedoman yang biasa dipakai: gunakan var saat tipenya jelas dari sisi kanan, dan tulis tipenya saat tidak jelas:

var orders = new List<Order>();         // obvious: var is fine
var reader = new StreamReader(path);    // obvious
decimal discount = CalculateDiscount(); // not obvious: name the type
int count = items.Count();              // makes the intent clear

Jebakan yang halus: var total = 0; membuat total bertipe int, jadi menambahkan 2.5 ke variabel itu nanti akan gagal, dan var price = 10; adalah int, bukan decimal. Saat tipe literalnya bukan yang kamu inginkan, tulis tipenya atau tambahkan sufiks (10m, 0.0).

Scope

Variabel lokal ada sejak dideklarasikan sampai akhir blok { } tempat ia dideklarasikan. Variabel yang dideklarasikan di kepala loop atau di dalam blok if tidak terlihat setelahnya.

Output:

high
240

Berbeda dengan C dan C++, C# tidak mengizinkan blok di dalam mendeklarasikan variabel lokal dengan nama yang sama dengan variabel di blok luarnya (error CS0136): sebuah nama harus berarti satu hal di seluruh method. Dua blok yang sejajar boleh memakai nama yang sama, seperti dua loop for terpisah yang masing-masing mendeklarasikan i.

Definite assignment

Variabel lokal tidak punya nilai default. Compiler melacak setiap jalur di dalam method dan menolak mengompilasi kalau sebuah variabel mungkin dibaca sebelum diberi nilai:

int discount;
if (isMember)
{
    discount = 10;
}
Console.WriteLine(discount);
// error CS0165: Use of unassigned local variable 'discount'

Perbaiki dengan memberi nilai awal di deklarasi (int discount = 0;) atau dengan mengisinya di setiap cabang (tambahkan else). Field dan elemen array berbeda: keduanya otomatis diisi nilai default tipenya (0, false, null).

const: konstanta saat kompilasi

const adalah nilai yang ditetapkan saat kompilasi. Nilainya harus diisi dengan ekspresi konstan (literal, const lain, atau operasi aritmetika di antara keduanya), dan tipenya hanya boleh angka, char, bool, string, enum atau null.

Output:

Price in EUR
120.00 EUR
350

Field const secara implisit bersifat static, jadi diakses lewat nama tipenya (Pricing.VatRate), dan menulis static const adalah error. Compiler menyalin nilainya ke setiap tempat yang memakainya, karena itulah const tidak punya biaya saat program berjalan, dan karena itu juga const public di sebuah library sebaiknya berupa nilai yang tidak akan pernah berubah (seperti jumlah hari dalam seminggu).

readonly dan static readonly

Field readonly hanya bisa diisi di deklarasinya atau di constructor class-nya. Setelah objek selesai dibuat, nilainya tidak bisa berubah. Berbeda dengan const, nilainya dihitung saat program berjalan, bisa bertipe apa saja, dan bisa berbeda antarobjek.

Output:

ACC-17 opened 2024-05-02
Launch: 2020-01-15
basic, pro

Baris terakhir menunjukkan salah paham yang umum: readonly melindungi field-nya, bukan objek yang dirujuknya. Plans akan selalu merujuk ke array yang sama, tetapi elemen array itu tetap bisa berubah. Untuk collection yang benar-benar immutable, pakai ReadOnlyCollection<T> atau ImmutableArray<T>.

Ringkasan ketiganya:

constreadonlystatic readonly
Nilai diketahuiSaat kompilasiSaat program berjalanSaat program berjalan
Tipe yang diizinkanAngka, char, bool, string, enum, nullApa sajaApa saja
Diisi diHanya di deklarasiDeklarasi atau constructorDeklarasi atau static constructor
Per objek atau bersamaBersama (implisit static)Per objekBersama
Variabel lokalYa (const int x = 1;)TidakTidak

Konvensi penamaan

Nama di C# peka huruf besar-kecil (total dan Total adalah variabel yang berbeda) dan harus diawali huruf atau garis bawah. Konvensi Microsoft, yang diikuti hampir semua kode C#:

  • Variabel lokal dan parameter: camelCase (orderCount, unitPrice).
  • Konstanta, property, method, class dan field public: PascalCase (MaxItems, VatRate).
  • Field private: _camelCase dengan garis bawah di depan (_balance), konvensi yang tersebar luas di kode .NET.
  • Boolean dibaca seperti pertanyaan: isActive, hasDiscount, canRetry.
  • Hindari singkatan dan awalan gaya Hungaria (strName, iCount).

Kata kunci C# tidak bisa dipakai sebagai nama, kecuali kamu menambahkan awalan @: var @class = "5B"; sah, yang kadang berguna untuk kode yang dibuat otomatis atau nama field JSON.

Sejak C# 7, tuple memungkinkan kamu mengisi beberapa variabel dalam satu pernyataan, sehingga menukar nilai cukup satu baris:

Output:

20 10
Lisbon: 545,000

Bentuk kedua adalah dekonstruksi: bentuk ini mendeklarasikan city sebagai string dan population sebagai int dari sebuah tuple. Selengkapnya di tuple.

Pertanyaan yang sering diajukan

Apa itu var di C#?

var memberi tahu compiler untuk menyimpulkan tipe variabel lokal dari nilai awalnya: var count = 5; mendeklarasikan sebuah int. Variabelnya tetap bertipe statis dan nantinya tidak bisa menyimpan string. var hanya berlaku untuk variabel lokal yang diberi nilai awal di pernyataan yang sama.

Apa bedanya const dan readonly di C#?

const adalah konstanta saat kompilasi: nilainya harus sudah diketahui saat kompilasi (angka, string, bool, null), secara implisit bersifat static, dan nilainya disalin ke setiap tempat yang memakainya. Field readonly diisi sekali saat program berjalan, di deklarasinya atau di constructor, bisa bertipe apa saja, dan nilainya bisa berbeda untuk tiap objek.

Kapan sebaiknya memakai static readonly alih-alih const?

Pakai static readonly untuk nilai bersama yang tidak bisa menjadi konstanta saat kompilasi, seperti DateTime, array atau objek, atau untuk nilai public yang mungkin berubah antarversi sebuah library. Karena nilai const disalin ke assembly yang memanggilnya, mengubah const public berarti harus mengompilasi ulang setiap assembly yang memakainya.

Apa arti "use of unassigned local variable" di C#?

Error CS0165: compiler menemukan jalur di mana sebuah variabel lokal dibaca sebelum diberi nilai apa pun. Variabel lokal tidak punya nilai default di C#. Beri nilai awal saat mendeklarasikannya, atau pastikan setiap cabang if/switch mengisinya sebelum dipakai.

Sebaiknya pakai var atau tipe eksplisit di C#?

Keduanya sama-sama boleh; tim yang memilih gayanya. Aturan yang umum adalah memakai var saat tipenya jelas dari sisi kanan (var list = new List<string>();) dan menulis tipenya saat tidak jelas (decimal total = GetTotal();). Codebase runtime .NET kurang lebih mengikuti aturan itu.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai