Memahami Struct C#: Definisi, Penggunaan, dan Perbedaan Utama
Struct C#
Pelajari cara mendefinisikan, membuat instance, dan bekerja dengan struct C#, termasuk konstruktor, properti, dan perbedaan utamanya dari kelas.
Dalam C#, struct (struktur) berfungsi mirip dengan kelas tetapi merupakan tipe nilai, yang berarti menyimpan data secara langsung daripada referensi.
Misalkan kita ingin menyimpan nama dan usia seseorang. Kita dapat membuat dua variabel: name dan age dan menyimpan nilai.
Namun, jika kita perlu menyimpan informasi ini untuk beberapa orang, mendeklarasikan variabel terpisah menjadi melelahkan. Mendefinisikan struct yang berisi name dan age memungkinkan kita menggunakan tata letak yang sama untuk setiap orang.
Definisikan struct dalam C#
Dalam C#, kita menggunakan kata kunci struct untuk mendeklarasikan struct. Contohnya:
struct Employee { public int id; }
Di sini, id adalah bidang di dalam struct. Struct juga dapat berisi metode, indekser, dan lainnya.
Deklarasikan variabel struct
Sebelum menggunakan struct, Anda harus membuat variabel struct. Sintaksnya adalah:
struct Employee { public int id; } // deklarasikan emp dari struct Employee Employee emp;
Dalam contoh, kita mendefinisikan struct bernama Employee dan mendeklarasikan variabel emp dari tipe tersebut.
Akses struct C#
Akses anggota struct menggunakan operator titik (.):
Employee emp; emp.id = 1;
Ini menetapkan nilai 1 ke bidang id dari struct Employee.
Catatan: Tipe primitif seperti int, bool, dan float adalah struct yang telah ditentukan sebelumnya dalam C#.
Contoh: Struct C#
using System; namespace CsharpStruct { // mendefinisikan struct struct Employee { public int id; public void getId(int id) { Console.WriteLine("Id Karyawan: " + id); } } class Program { static void Main(string[] args) { // deklarasikan emp dari struct Employee Employee emp; // mengakses dan menetapkan bidang struct emp.id = 1; // mengakses metode struct emp.getId(emp.id); Console.ReadLine(); } } }
Output
Id Karyawan: 1
Program membuat struct Employee, menetapkan bidang idnya, dan memanggil metode getId untuk menampilkannya.
Anda juga dapat membuat instance struct dengan kata kunci new:
Employee emp = new Employee();
Ini memanggil konstruktor tanpa parameter dan menginisialisasi semua bidang ke nilai defaultnya.
Konstruktor dalam Struct C#
Struct dapat mendefinisikan konstruktor untuk menginisialisasi bidang. Contoh:
struct Employee { public int id; // konstruktor public Employee(int employeeId) { id = employeeId; } }
Catatan: Sebelum C# 10, struct tidak dapat berisi konstruktor tanpa parameter.
Contoh: Konstruktor dalam Struct C#
using System; namespace CsharpStruct { // mendefinisikan struct struct Employee { public int id; public string name; // konstruktor parameterized public Employee(int employeeId, string employeeName) { id = employeeId; name = employeeName; } } class Program { static void Main(string[] args) { // memanggil konstruktor struct Employee emp = new Employee(1, "Brian"); Console.WriteLine("Nama Karyawan: " + emp.name); Console.WriteLine("Id Karyawan: " + emp.id); Console.ReadLine(); } } }
Output
Nama Karyawan: Brian Id Karyawan: 1
Dalam contoh ini, konstruktor menetapkan nilai ke semua bidang. Gagal menginisialisasi setiap bidang menghasilkan kesalahan waktu kompilasi.
Properti dalam Struct C#
Struct dapat mengekspos properti untuk enkapsulasi. Contoh:
using System; namespace CsharpStruct { // mendefinisikan struct struct Employee { public int id; // membuat properti public int Id { get { return id; } set { id = value; } } } class Program { static void Main(string[] args) { Employee emp = new Employee(); emp.Id = 1; Console.WriteLine("Id Karyawan: " + emp.Id); Console.ReadLine(); } } }
Output
Id Karyawan: 1
Di sini, properti Id menyediakan akses yang terkontrol ke bidang id.
Perbedaan antara Kelas dan Struct dalam C#
Meskipun kelas dan struct berbagi sintaks yang sama, mereka berbeda secara fundamental:
- Sebuah kelas adalah tipe referensi; sebuah struct adalah tipe nilai.
- Menugaskan instance kelas menyalin referensi, sehingga dua variabel menunjuk ke objek yang sama. Menugaskan struct menyalin seluruh nilai.
- Struct tidak mendukung pewarisan, sedangkan kelas mendukungnya.
Contoh perilaku referensi kelas:
using System; namespace CsharpStruct { class Employee { public string name; } class Program { static void Main(string[] args) { Employee emp1 = new Employee(); emp1.name = "John"; Employee emp2 = emp1; emp2.name = "Ed"; Console.WriteLine("Nama Karyawan1: " + emp1.name); Console.ReadLine(); } } }
Output
Nama Karyawan1: Ed
Contoh perilaku nilai struct:
using System; namespace CsharpStruct { struct Employee { public string name; } class Program { static void Main(string[] args) { Employee emp1 = new Employee(); emp1.name = "John"; Employee emp2 = emp1; emp2.name = "Ed"; Console.WriteLine("Nama Karyawan1: " + emp1.name); Console.ReadLine(); } } }
Output
Nama Karyawan1: John
Dalam contoh struct, emp2 menerima salinan dari emp1, sehingga modifikasi pada emp2 tidak mempengaruhi emp1.
Perbedaan ini membuat struct ideal untuk struktur data kecil dan tidak dapat diubah yang mendapatkan manfaat dari alokasi stack dan semantik nilai.