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:

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 jenis char dan 2001 merupakan harfiah dari jenis int.

  • 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