Bagikan melalui


Jenis nilai (referensi C#)

Jenis nilai dan jenis referensi adalah dua kategori utama jenis C#. Variabel jenis nilai berisi instance jenis. Perilaku ini berbeda dari variabel jenis referensi, yang berisi referensi ke instans jenis. Secara default, pada penugasan, meneruskan argumen ke metode, dan mengembalikan hasil metode, Anda menyalin nilai variabel. Dalam kasus variabel jenis nilai, Anda menyalin instans jenis yang sesuai. 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, Anda hanya menyalin referensi ke instans jenis referensi saat Menyalin instans jenis nilai. 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 menjadi salah satu jenis berikut:

  • Jenis struktur, yang merangkum data dan fungsionalitas terkait.
  • Jenis enumerasi, yang didefinisikan oleh sekumpulan konstanta bernama dan mewakili pilihan atau kombinasi pilihan.
  • Deklarasi serikat, yang menentukan sekumpulan jenis kasus tertutup yang dapat diwakili nilai.

JenisT? nilai nullable mewakili semua nilai dari jenis T nilai yang mendasar dan nilai null tambahan. Anda tidak dapat menetapkan null ke variabel jenis nilai, kecuali itu adalah jenis nilai yang dapat diubah ke null.

struct Gunakan batasan untuk menentukan bahwa parameter jenis adalah jenis nilai yang tidak dapat diubah ke null. Jenis struktur dan enumerasi memenuhi batasan struct. Gunakan 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 struct. Mereka berbeda dari jenis struct lain karena mereka mengizinkan operasi tambahan tertentu:

  • Anda dapat menggunakan literal untuk memberikan nilai jenis sederhana.
    Misalnya, 'A' adalah harfiah dari jenis char, 2001 adalah harfiah dari jenis int, dan 12.34m merupakan harfiah dari jenis decimal.

  • Anda dapat mendeklarasikan konstanta jenis sederhana dengan menggunakan kata kunci const .
    Misalnya, Anda dapat menentukan const decimal = 12.34m.
    Anda tidak dapat mendeklarasikan konstanta dari jenis struct 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