Pernyataan deklarasi
Pernyataan deklarasi mendeklarasikan variabel lokal baru, konstanta lokal, atau variabel referensi lokal. Untuk mendeklarasikan variabel lokal, tentukan jenisnya dan berikan namanya. Anda dapat mendeklarasikan beberapa variabel dengan jenis yang sama dalam satu pernyataan, seperti yang ditunjukkan contoh berikut:
string greeting;
int a, b, c;
List<double> xs;
Dalam pernyataan deklarasi, Anda juga dapat menginisialisasi variabel dengan nilai awalnya:
string greeting = "Hello";
int a = 3, b = 2, c = a + b;
List<double> xs = new();
Contoh sebelumnya secara eksplisit menentukan jenis variabel. Anda juga dapat membiarkan pengkompilasi menyimpulkan jenis variabel dari ekspresi inisialisasinya. Untuk melakukannya, gunakan var
kata kunci alih-alih nama jenis. Untuk informasi selengkapnya, lihat bagian Variabel lokal yang ditik secara implisit .
Untuk mendeklarasikan konstanta lokal, gunakan const
kata kunci, seperti yang ditunjukkan contoh berikut:
const string Greeting = "Hello";
const double MinLimit = -10.0, MaxLimit = -MinLimit;
Saat Anda mendeklarasikan konstanta lokal, Anda juga harus menginisialisasinya.
Untuk informasi tentang variabel referensi lokal, lihat bagian Variabel referensi .
Variabel lokal yang dititik secara implisit
Saat Anda mendeklarasikan variabel lokal, Anda dapat membiarkan pengkompilasi menyimpulkan jenis variabel dari ekspresi inisialisasi. Untuk melakukannya, gunakan var
kata kunci alih-alih nama jenis:
var greeting = "Hello";
Console.WriteLine(greeting.GetType()); // output: System.String
var a = 32;
Console.WriteLine(a.GetType()); // output: System.Int32
var xs = new List<double>();
Console.WriteLine(xs.GetType()); // output: System.Collections.Generic.List`1[System.Double]
Seperti yang ditunjukkan oleh contoh sebelumnya, variabel lokal yang ditik secara implisit sangat ditik.
Catatan
Saat Anda menggunakan var
dalam konteks sadar nullable yang diaktifkan dan jenis ekspresi inisialisasi adalah jenis referensi, pengkompilasi selalu menyimpulkan jenis referensi nullable meskipun jenis ekspresi inisialisasi tidak dapat diubah ke null.
Penggunaan var
umum adalah dengan ekspresi pemanggilan konstruktor. Penggunaan var
memungkinkan Anda untuk tidak mengulangi nama jenis dalam deklarasi variabel dan pembuatan instans objek, seperti yang ditunjukkan contoh berikut:
var xs = new List<int>();
Anda dapat menggunakan ekspresi berjenis new
target sebagai alternatif:
List<int> xs = new();
List<int>? ys = new();
Saat Anda bekerja dengan jenis anonim, Anda harus menggunakan variabel lokal yang ditik secara implisit. Contoh berikut menunjukkan ekspresi kueri yang menggunakan jenis anonim untuk menahan nama pelanggan dan nomor telepon:
var fromPhoenix = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
foreach (var customer in fromPhoenix)
{
Console.WriteLine($"Name={customer.Name}, Phone={customer.Phone}");
}
Dalam contoh sebelumnya, Anda tidak dapat secara eksplisit menentukan jenis fromPhoenix
variabel. Jenisnya IEnumerable<T> tetapi dalam hal T
ini adalah jenis anonim dan Anda tidak dapat memberikan namanya. Itu sebabnya Anda perlu menggunakan var
. Untuk alasan yang sama, Anda harus menggunakan var
ketika Anda mendeklarasikan variabel iterasi customer
dalam foreach
pernyataan.
Untuk informasi selengkapnya tentang variabel lokal yang ditik secara implisit, lihat Variabel lokal yang ditik secara implisit.
Dalam pencocokan pola, kata kunci var
digunakan dalam var
pola.
Variabel referensi
Saat Anda mendeklarasikan variabel lokal dan menambahkan ref
kata kunci sebelum jenis variabel, Anda mendeklarasikan variabel referensi, atau ref
lokal:
ref int aliasOfvariable = ref variable;
Variabel referensi adalah variabel yang mengacu pada variabel lain, yang disebut referensi. Artinya, variabel referensi adalah alias untuk referensinya. Saat Anda menetapkan nilai ke variabel referensi, nilai tersebut ditetapkan ke referensi. Saat Anda membaca nilai variabel referensi, nilai referensi dikembalikan. Contoh berikut menunjukkan perilaku tersebut:
int a = 1;
ref int aliasOfa = ref a;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})"); // output: (a, aliasOfa) is (1, 1)
a = 2;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})"); // output: (a, aliasOfa) is (2, 2)
aliasOfa = 3;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})"); // output: (a, aliasOfa) is (3, 3)
ref
Gunakan operator = ref
penugasan untuk mengubah referensi variabel referensi, seperti yang ditunjukkan contoh berikut:
void Display(int[] s) => Console.WriteLine(string.Join(" ", s));
int[] xs = [0, 0, 0];
Display(xs);
ref int element = ref xs[0];
element = 1;
Display(xs);
element = ref xs[^1];
element = 3;
Display(xs);
// Output:
// 0 0 0
// 1 0 0
// 1 0 3
Dalam contoh sebelumnya, variabel referensi diinisialisasi element
sebagai alias ke elemen array pertama. ref
Kemudian ditetapkan kembali untuk merujuk ke elemen array terakhir.
Anda dapat menentukan ref readonly
variabel lokal. Anda tidak dapat menetapkan nilai ke ref readonly
variabel. Namun Anda dapat ref
menetapkan ulang variabel referensi tersebut, seperti yang ditunjukkan contoh berikut:
int[] xs = [1, 2, 3];
ref readonly int element = ref xs[0];
// element = 100; error CS0131: The left-hand side of an assignment must be a variable, property or indexer
Console.WriteLine(element); // output: 1
element = ref xs[^1];
Console.WriteLine(element); // output: 3
Anda dapat menetapkan referensi kembali ke variabel referensi, seperti yang ditunjukkan contoh berikut:
using System;
public class NumberStore
{
private readonly int[] numbers = [1, 30, 7, 1557, 381, 63, 1027, 2550, 511, 1023];
public ref int GetReferenceToMax()
{
ref int max = ref numbers[0];
for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i] > max)
{
max = ref numbers[i];
}
}
return ref max;
}
public override string ToString() => string.Join(" ", numbers);
}
public static class ReferenceReturnExample
{
public static void Run()
{
var store = new NumberStore();
Console.WriteLine($"Original sequence: {store.ToString()}");
ref int max = ref store.GetReferenceToMax();
max = 0;
Console.WriteLine($"Updated sequence: {store.ToString()}");
// Output:
// Original sequence: 1 30 7 1557 381 63 1027 2550 511 1023
// Updated sequence: 1 30 7 1557 381 63 1027 0 511 1023
}
}
Dalam contoh sebelumnya, GetReferenceToMax
metode ini adalah metode returns-by-ref . Ini tidak mengembalikan nilai maksimum itu sendiri, tetapi pengembalian referensi yang merupakan alias ke elemen array yang menyimpan nilai maksimum. Metode menetapkan Run
referensi yang dikembalikan ke max
variabel referensi. Kemudian, dengan menetapkan ke max
, ini memperbarui penyimpanan store
internal instans. Anda juga dapat menentukan ref readonly
metode. Pemanggil ref readonly
metode tidak dapat menetapkan nilai ke pengembalian referensinya.
Variabel iterasi foreach
pernyataan dapat menjadi variabel referensi. Untuk informasi selengkapnya, lihat foreach
bagian pernyataan dari artikel Pernyataan perulangan.
Dalam skenario kritis performa, penggunaan variabel referensi dan pengembalian dapat meningkatkan performa dengan menghindari operasi penyalinan yang berpotensi mahal.
Pengkompilasi memastikan bahwa variabel referensi tidak melampaui referensinya dan tetap valid selama masa pakainya. Untuk informasi selengkapnya, lihat bagian Konteks aman Ref dari spesifikasi bahasa C#.
Untuk informasi tentang ref
bidang, lihat bagianref
bidang dari ref
artikel jenis struktur.
ref tercakup
Kata kunci scoped
kontekstual membatasi masa pakai nilai. Pengubah scoped
membatasi masa pakai ref-safe-to-escape atau safe-to-escape, masing-masing, ke metode saat ini. Secara efektif, menambahkan pengubah scoped
menegaskan bahwa kode Anda tidak akan memperpanjang masa pakai variabel.
Anda dapat menerapkan scoped
ke parameter atau variabel lokal. Pengubah scoped
dapat diterapkan ke parameter dan lokal ketika jenisnya adalah ref struct
. Jika tidak, pengubah scoped
hanya dapat diterapkan ke variabel referensi lokal. Itu termasuk variabel lokal yang dideklarasikan dengan ref
pengubah dan parameter yang dideklarasikan dengan in
, ref
atau out
pengubah.
Pengubah scoped
secara implisit ditambahkan ke this
dalam metode yang struct
dideklarasikan dalam parameter , out
dan ref
parameter ketika jenisnya adalah ref struct
.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
Untuk informasi selengkapnya tentang pengubah scoped
, lihat catatan proposal peningkatan struct tingkat rendah.