Memeriksa sistem jenis .NET

Selesai

C# adalah bahasa yang sangat ditik. Setiap variabel dan konstanta memiliki jenis, seperti halnya setiap ekspresi yang mengevaluasi ke nilai. Pustaka kelas .NET mendefinisikan jenis numerik bawaan dan jenis kompleks yang mewakili berbagai konstruksi. Konstruksi ini mencakup sistem file, koneksi jaringan, koleksi dan array objek, dan tanggal. Program C# umum menggunakan jenis dari pustaka kelas dan jenis yang ditentukan pengguna yang memodelkan konsep yang khusus untuk domain masalah program.

Jenis bawaan

C# menyediakan sekumpulan jenis bawaan standar. Jenis standar ini mewakili bilangan bulat, nilai titik pecahan, ekspresi Boolean, karakter teks, nilai desimal, dan jenis data lainnya. Ada juga jenis string dan objek bawaan. Jenis-jenis ini tersedia untuk Anda gunakan dalam program C# apa pun.

Jenis kustom

Anda menggunakan konstruksi struct, class, interface, enum, dan record untuk membuat jenis kustom Anda sendiri. Pustaka kelas .NET itu sendiri adalah kumpulan jenis kustom yang dapat Anda gunakan dalam aplikasi Anda sendiri. Secara default, jenis yang paling sering digunakan di pustaka kelas tersedia dalam program C# apa pun. Yang lain hanya tersedia ketika Anda secara eksplisit menambahkan referensi proyek ke rakitan yang menentukannya. Setelah pengkompilasi memiliki referensi ke rakitan, Anda dapat mendeklarasikan variabel (dan konstanta) dari jenis yang dideklarasikan dalam rakitan tersebut dalam kode sumber.

Sistem jenis umum

Penting untuk memahami dua poin mendasar tentang sistem jenis di .NET:

  • Ini mendukung prinsip warisan. Jenis dapat berasal dari jenis lain, yang disebut jenis dasar. Jenis turunan mewarisi (dengan beberapa batasan) metode, properti, dan anggota lain dari jenis dasar. Jenis dasar pada gilirannya dapat berasal dari beberapa jenis lain, dalam hal ini jenis turunan mewarisi anggota dari kedua jenis dasar dalam hierarki warisannya. Semua jenis, termasuk jenis numerik bawaan seperti System.Int32 (kata kunci C#: int), pada akhirnya berasal dari satu jenis dasar, yang System.Object (kata kunci C#: object). Hierarki jenis terpadu ini disebut Common Type System (CTS).

  • Setiap jenis dalam CTS didefinisikan sebagai jenis nilai atau jenis referensi. Jenis ini mencakup semua jenis kustom di pustaka kelas .NET dan juga jenis yang ditentukan pengguna Anda sendiri. Jenis yang Anda tentukan dengan menggunakan kata kunci struct adalah jenis nilai; semua jenis numerik bawaan adalah struktur. Jenis yang Anda tentukan dengan menggunakan kata kunci kelas atau rekaman adalah jenis referensi. Jenis referensi dan jenis nilai memiliki aturan waktu kompilasi yang berbeda, dan perilaku run-time yang berbeda.

Ilustrasi berikut menunjukkan hubungan antara jenis nilai dan jenis referensi di CTS.

Diagram memperlihatkan tipe nilai dan referensi.

Kelas dan struktur adalah dua konstruksi dasar dari sistem jenis umum di .NET. Masing-masing pada dasarnya adalah struktur data yang merangkum sekumpulan data dan perilaku yang dimiliki bersama-sama sebagai unit logis. Data dan perilaku adalah anggota class, struct, atau record. Anggota kelas mencakup properti (data), metode (perilaku), bidang (variabel yang dideklarasikan di dalam kelas), dan banyak lainnya.

Deklarasi class, struct, atau record seperti cetak biru yang digunakan untuk membuat instans atau objek pada waktu proses. Jika Anda menentukan kelas bernama Person, Person adalah nama jenisnya. Jika Anda mendeklarasikan dan menginisialisasi variabel p jenis Person, p dikatakan sebagai objek atau instans Person. Beberapa instans dengan jenis Person yang sama dapat dibuat, dan setiap instans dapat memiliki nilai yang berbeda dalam properti dan bidangnya.

Kelas adalah jenis referensi. Ketika objek jenis dibuat, variabel tempat objek ditetapkan hanya menyimpan referensi ke memori tersebut. Ketika referensi objek ditetapkan ke variabel baru, variabel baru mengacu pada objek asli. Perubahan yang dilakukan melalui satu variabel tercermin dalam variabel lain karena keduanya merujuk ke data yang sama.

struct adalah jenis nilai. Saat struct dibuat, variabel tempat struct ditetapkan menyimpan data aktual struct. Saat struct ditetapkan ke variabel baru, nilai data disalin. Oleh karena itu, variabel baru dan variabel asli berisi dua salinan terpisah dari data yang sama. Perubahan yang dilakukan pada satu salinan tidak memengaruhi salinan lainnya.

Jenis rekaman dapat berupa jenis referensi (record class) atau jenis nilai (record struct). Jenis rekaman berisi metode yang mendukung kesetaraan nilai.

Secara umum, kelas digunakan untuk memodelkan perilaku yang lebih kompleks. Kelas biasanya menyimpan data yang dimaksudkan untuk dimodifikasi setelah objek kelas dibuat. Struktur paling cocok untuk struktur data kecil. Struktur biasanya menyimpan data yang tidak dimaksudkan untuk dimodifikasi setelah struct dibuat. Jenis rekaman adalah struktur data dengan anggota kompilator lain yang disintesis. Rekaman biasanya menyimpan data yang tidak dimaksudkan untuk dimodifikasi setelah objek dibuat.

Jenis nilai

Jenis nilai berasal dari System.ValueType, yang berasal dari System.Object. Jenis yang berasal dari System.ValueType memiliki perilaku khusus dalam runtime bahasa umum. Variabel jenis nilai secara langsung berisi nilainya. Memori untuk struct dialokasikan sebaris dalam konteks apa pun variabel yang dideklarasikan. Tidak ada alokasi tumpukan terpisah atau overhead pengumpulan sampah untuk variabel jenis nilai. Anda dapat mendeklarasikan jenis struct rekaman yang merupakan jenis nilai dan menyertakan anggota yang disintesis untuk rekaman.

Ada dua kategori jenis nilai: struct dan enum.

Jenis numerik bawaan adalah struktur, dan memiliki bidang dan metode yang dapat Anda akses:


// constant field on type byte.
byte b = byte.MaxValue;

Tetapi Anda mendeklarasikan dan menetapkan nilai kepada mereka seolah-olah mereka adalah jenis non-agregat sederhana:


byte num = 0xA;
int i = 5;
char c = 'Z';

Jenis nilai tertutup . Anda tidak dapat memperoleh jenis dari jenis nilai apa pun, misalnya System.Int32. Anda tidak dapat menentukan struct untuk diwarisi dari class atau struct yang ditentukan pengguna karena struct hanya dapat mewarisi dari System.ValueType.

Anda menggunakan kata kunci struktur untuk membuat jenis nilai kustom Anda sendiri. Biasanya, struct digunakan sebagai kontainer untuk sekumpulan kecil variabel terkait, seperti yang ditunjukkan dalam contoh berikut:


public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Kategori jenis nilai lainnya adalah enum. enum mendefinisikan sekumpulan konstanta integral bernama. Misalnya, enumerasi System.IO.FileMode di pustaka kelas .NET berisi sekumpulan bilangan bulat konstanta bernama yang menentukan bagaimana file harus dibuka. Sintaks untuk enum diperlihatkan dalam contoh berikut:


public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

Konstanta System.IO.FileMode.Create memiliki nilai 2. Namun, namanya jauh lebih bermakna bagi manusia yang membaca kode sumber, dan untuk alasan itu lebih baik menggunakan enumerasi alih-alih angka harfiah yang konstan.

Semua enums mewarisi dari System.Enum, yang mewarisi dari System.ValueType. Semua aturan yang berlaku untuk structs juga berlaku untuk enums.

Jenis referensi

Jenis class, record, delegate, array, dan interface adalah jenis referensi .

Saat Anda mendeklarasikan variabel jenis referensi, variabel tersebut berisi nilai null hingga Anda menetapkannya dengan instans jenis tersebut atau membuatnya menggunakan operator new.

Contoh berikut menunjukkan cara mendeklarasikan variabel jenis referensi menggunakan array:


// Declaring an array variable
int[] numbers;

// Initializing the array with a size of 5
numbers = new int[5];

// Alternatively, declaring and initializing an array in one line
int[] numbers2 = new int[] { 1, 2, 3, 4, 5 };

// Assigning a reference to another variable
int[] numbers3 = numbers2;

Operator new membuat instans jenis dan mengembalikan referensi ke instans tersebut. Referensinya adalah alamat memori objek, dan referensi tersebut disimpan dalam variabel. Saat Anda menetapkan variabel jenis referensi ke variabel lain, Anda menyalin referensi, bukan objek itu sendiri. Kedua variabel merujuk ke objek yang sama dalam memori.

Nota

Selain menjadi jenis referensi, array adalah koleksi. Koleksi dapat diinisialisasi menggunakan ekspresi koleksi, yang menghilangkan persyaratan untuk menyertakan kata kunci new saat mendeklarasikan dan menginisialisasi array dalam satu baris. Misalnya: int[] numbers = [ 1, 2, 3, 4, 5 ];.

Anda dapat membuat instans kelas menggunakan sintaks yang sama yang digunakan untuk membuat instans jenis bawaan. Contoh berikut menunjukkan cara membuat instans kelas:


MyClass myClass = new MyClass();
MyClass myClass2 = myClass;

Operator new membuat instans kelas dan mengembalikan referensi ke instans tersebut. Referensinya adalah alamat memori objek, dan referensi tersebut disimpan dalam variabel. Saat Anda menetapkan variabel jenis referensi ke variabel lain, Anda menyalin referensi, bukan objek itu sendiri. Kedua variabel merujuk ke objek yang sama dalam memori.