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 varpola.

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 bagianrefbidang 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 structdideklarasikan 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.

Lihat juga