Bagikan melalui


Operator Penugasan (Referensi C#)

Operator = penugasan mengatur nilai dari operand di sisi kanannya ke variabel, properti, atau elemen pengindeks yang ditentukan oleh operand di sisi kirinya. Hasil dari ekspresi penugasan adalah nilai yang diberikan ke operand sebelah kiri. Jenis operand sisi-kanan harus sama dengan jenis operand sisi-kiri atau secara implisit dapat dikonversi ke dalamnya.

Operator penugasan = bersifat asosiasi ke kanan, yaitu, ekspresi dari bentuk tersebut

a = b = c

Dievaluasi sebagai

a = (b = c)

Contoh berikut menunjukkan penggunaan operator penugasan dengan variabel lokal, properti, dan elemen pengindeks sebagai operand sisi-kirinya:

List<double> numbers = [1.0, 2.0, 3.0];

Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100

int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5

Operand penugasan di sebelah kiri menerima nilai dari operand di sebelah kanan. Saat operand adalah jenis nilai, penetapan menyalin konten operand sebelah kanan. Ketika operand adalah jenis referensi, penetapan menyalin referensi ke objek.

Operasi ini disebut penetapan nilai: nilai ditetapkan.

Dimulai dengan C# 14, sisi kiri penetapan nilai dapat menyertakan ekspresi anggota kondisional null, seperti ?. atau ?[]. Jika sisi kiri null, ekspresi sisi kanan tidak dievaluasi.

penetapan ref

Penetapan Ref menjadikan operan di sebelah kiri sebagai alias untuk operan di sebelah kanan, seperti dalam contoh berikut.

void Display(double[] s) => Console.WriteLine(string.Join(" ", s));

double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);

ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);

arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5

Dalam contoh sebelumnya, variabel referensi lokal diinisialisasi sebagai alias ke elemen array pertama. Kemudian, ref dialihkan kembali untuk merujuk ke elemen terakhir array. Karena ini adalah alias, ketika Anda memperbarui nilainya dengan operator =penugasan biasa , elemen array yang sesuai juga diperbarui.

Operan ref tugas sebelah kiri dapat berupa variabel referensi lokal, ref bidang, dan refparameter metode , out, atau in . Kedua operan harus berjenis yang sama.

Penugasan ref berarti bahwa variabel referensi memiliki referensi yang berbeda. Ini tidak lagi merujuk pada acuannya yang sebelumnya. Menggunakan ref = pada parameter ref berarti parameter tidak lagi mengacu pada argumennya. Setiap tindakan yang mengubah status objek setelah ref dialihkan akan membuat modifikasi tersebut pada item baru. Misalnya, pertimbangkan metode berikut:

private static void RefReassignAndModify(scoped ref string s)
{
    string sLocal = "Hello";
    Console.WriteLine(sLocal);  // Output: Hello

    s = ref sLocal;
    s = "World";
    Console.WriteLine(s);  // Output: World

Penggunaan berikut menunjukkan bahwa penugasan ke parameter s tidak terlihat setelah panggilan metode karena sref ditetapkan kembali untuk merujuk ke sLocal sebelum string diubah:

string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!

Penugasan gabungan

Untuk operator biner op, ekspresi penetapan campuran berbentuk

x op= y

Setara dengan

x = x op y

Kecuali bahwa x hanya dievaluasi sekali.

Operator aritmatika, logika Boolean, dan logika bitwise dan shift semuanya mendukung penetapan majemuk.

Penetapan penggabungan-null

Anda dapat menggunakan operator penugasan null-coalescing ??= untuk menetapkan nilai operand sebelah kanannya ke operand sebelah kirinya jika dan hanya jika operand sebelah kiri bernilai null. Untuk informasi selengkapnya, lihat artikel ?? dan operator ??=.

Kelebihan beban operator

Jenis yang ditentukan pengguna tidak dapat membebani operator penugasan secara berlebihan. Namun, tipe yang ditentukan pengguna dapat menentukan konversi implisit ke tipe lainnya. Dengan begitu, nilai jenis yang ditentukan-pengguna dapat ditetapkan ke variabel, properti, atau elemen pengindeks dari jenis lain. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.

Jika tipe yang ditentukan pengguna membebani operator biner op, operator op=, jika ada, juga secara implisit dibebani. Dimulai dengan C# 14, jenis yang ditentukan pengguna dapat secara eksplisit membebani operator penetapan majemuk (op=) untuk memberikan implementasi yang lebih efisien. Biasanya, jenis membebani operator ini karena nilainya dapat diperbarui, daripada mengalokasikan instans baru untuk menahan hasil operasi biner. Jika jenis tidak memberikan kelebihan beban eksplisit, pengkompilasi menghasilkan kelebihan beban implisit.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian Operator penugasan dari spesifikasi bahasa C# dan spesifikasi fitur penetapan majemuk yang ditentukan pengguna .

Lihat juga