Jenis nilai (referensi C#)
Jenis nilai dan jenis referensi adalah dua kategori utama jenis C#. Variabel jenis nilai berisi instance jenis. Ini berbeda dari variabel jenis referensi, yang berisi referensi ke instance jenis. Secara default, pada penugasan, meneruskan argumen ke metode, dan mengembalikan hasil metode, nilai variabel disalin. Dalam kasus variabel jenis nilai, instans jenis yang sesuai disalin. Contoh berikut menunjukkan perilaku tersebut:
using System;
public struct MutablePoint
{
public int X;
public int Y;
public MutablePoint(int x, int y) => (X, Y) = (x, y);
public override string ToString() => $"({X}, {Y})";
}
public class Program
{
public static void Main()
{
var p1 = new MutablePoint(1, 2);
var p2 = p1;
p2.Y = 200;
Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified: {p1}");
Console.WriteLine($"{nameof(p2)}: {p2}");
MutateAndDisplay(p2);
Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");
}
private static void MutateAndDisplay(MutablePoint p)
{
p.X = 100;
Console.WriteLine($"Point mutated in a method: {p}");
}
}
// Expected output:
// p1 after p2 is modified: (1, 2)
// p2: (1, 200)
// Point mutated in a method: (100, 200)
// p2 after passing to a method: (1, 200)
Seperti yang ditunjukkan oleh contoh sebelumnya, operasi pada variabel jenis nilai hanya memengaruhi instans jenis nilai tersebut, yang disimpan dalam variabel.
Jika jenis nilai berisi anggota data dari jenis referensi, hanya referensi ke instans jenis referensi yang disalin saat instans jenis nilai disalin. Baik salinan instans jenis nilai maupun aslinya memiliki akses ke instans jenis referensi yang sama. Contoh berikut menunjukkan perilaku tersebut:
using System;
using System.Collections.Generic;
public struct TaggedInteger
{
public int Number;
private List<string> tags;
public TaggedInteger(int n)
{
Number = n;
tags = new List<string>();
}
public void AddTag(string tag) => tags.Add(tag);
public override string ToString() => $"{Number} [{string.Join(", ", tags)}]";
}
public class Program
{
public static void Main()
{
var n1 = new TaggedInteger(0);
n1.AddTag("A");
Console.WriteLine(n1); // output: 0 [A]
var n2 = n1;
n2.Number = 7;
n2.AddTag("B");
Console.WriteLine(n1); // output: 0 [A, B]
Console.WriteLine(n2); // output: 7 [A, B]
}
}
Catatan
Untuk membuat kode Anda tidak rawan kesalahan dan lebih kuat, tentukan dan gunakan jenis nilai yang tidak berubah. Artikel ini menggunakan jenis nilai yang dapat diubah hanya untuk tujuan demonstrasi.
Macam jenis nilai dan batasan jenis
Jenis nilai bisa salah satu dari dua jenis berikut:
- jenis struktur, yang merangkum data dan fungsionalitas terkait
- jenis enumerasi, yang didefinisikan oleh sekumpulan konstanta bernama dan mewakili pilihan atau kombinasi pilihan
Jenis nilai yang dapat diubah ke nullT?
mewakili semua nilai dari jenis nilai T
dan sebuah nilai null tambahan. Anda tidak dapat menetapkan null
ke variabel jenis nilai, kecuali itu adalah jenis nilai yang dapat diubah ke null.
Anda dapat menggunakan struct
batasan untuk menentukan bahwa parameter jenis adalah jenis nilai yang tidak dapat diubah ke null. Jenis struktur dan enumerasi memenuhi batasan struct
. Anda dapat menggunakan System.Enum
dalam batasan kelas dasar (yang dikenal sebagai batasan enum) untuk menentukan bahwa parameter jenis adalah jenis enumerasi.
Jenis nilai bawaan
C# menyediakan jenis nilai bawaan berikut, juga dikenal sebagai jenis sederhana:
- Jenis numerik integral
- Jenis numerik floating-point
- bool yang mewakili nilai Boolean
- char yang mewakili karakter Unicode UTF-16
Semua jenis sederhana adalah jenis struktur dan berbeda dari jenis struktur lainnya karena mereka mengizinkan operasi tambahan tertentu:
Anda dapat menggunakan literal untuk memberikan nilai jenis sederhana. Misalnya,
'A'
adalah harfiah dari jenischar
dan2001
merupakan harfiah dari jenisint
.Anda dapat mendeklarasikan konstanta dari jenis sederhana dengan kata kunci const. Tidak mungkin memiliki konstanta jenis struktur lainnya.
Ekspresi konstanta, yang operannya semuanya konstanta dari tipe sederhana, dievaluasi pada waktu kompilasi.
Tuple nilai adalah jenis nilai, tetapi bukan jenis sederhana.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk