Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Definisi kelas atau struktur seperti cetak biru yang menentukan apa yang dapat dilakukan jenis tersebut. Objek adalah blok memori yang dialokasikan dan dikonfigurasi program sesuai dengan cetak biru. Program mungkin membuat banyak objek dari kelas yang sama. Anda juga dapat menyebut objek sebagai instans. Anda dapat menyimpannya dalam variabel bernama atau dalam array atau koleksi. Kode klien menggunakan variabel ini untuk memanggil metode dan mengakses properti publik objek. Dalam bahasa berorientasi objek seperti C#, program umum terdiri dari beberapa objek yang berinteraksi secara dinamis.
Nota
Jenis statis bersifat berbeda dari apa yang dijelaskan dalam artikel ini. Untuk informasi lebih lanjut, lihat Kelas Statik dan Anggota Kelas Statik.
Membuat instans vs. instans kelas
Karena kelas adalah jenis referensi, variabel objek kelas menyimpan referensi ke alamat objek pada tumpukan terkelola. Jika Anda menetapkan variabel kedua dengan jenis yang sama ke variabel pertama, kedua variabel merujuk ke objek di alamat tersebut. Artikel ini membahas poin ini secara lebih rinci nanti.
Anda membuat instans kelas dengan menggunakan new operator. Dalam contoh berikut, Person adalah jenis dan person1 dan person2 merupakan instans, atau objek, dari jenis tersebut.
using System;
public class Person(string name, int age)
{
public string Name { get; set; } = name;
public int Age { get; set; } = age;
// Other properties, methods, events...
}
class Program
{
static void Main()
{
Person person1 = new("Leopold", 6);
Console.WriteLine($"person1 Name = {person1.Name} Age = {person1.Age}");
// Declare new person, assign person1 to it.
Person person2 = person1;
// Change the name of person2, and person1 also changes.
person2.Name = "Molly";
person2.Age = 16;
Console.WriteLine($"person2 Name = {person2.Name} Age = {person2.Age}");
Console.WriteLine($"person1 Name = {person1.Name} Age = {person1.Age}");
/*
Output:
person1 Name = Leopold Age = 6
person2 Name = Molly Age = 16
person1 Name = Molly Age = 16
*/
}
}
Karena struktur adalah jenis nilai, variabel objek struct menyimpan salinan seluruh objek. Anda juga dapat membuat instans struktur dengan menggunakan new operator, tetapi Anda tidak perlu menggunakannya, seperti yang ditunjukkan dalam contoh berikut:
using System;
namespace Example
{
public struct Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
public class Application
{
static void Main()
{
// Create struct instance and initialize by using "new".
// Memory is allocated on thread stack.
Person p1 = new("Alex", 9);
Console.WriteLine($"p1 Name = {p1.Name} Age = {p1.Age}");
// Create new struct object. Note that struct can be initialized
// without using "new".
Person p2 = p1;
// Assign values to p2 members.
p2.Name = "Spencer";
p2.Age = 7;
Console.WriteLine($"p2 Name = {p2.Name} Age = {p2.Age}");
// p1 values remain unchanged because p2 is copy.
Console.WriteLine($"p1 Name = {p1.Name} Age = {p1.Age}");
}
}
/*
Output:
p1 Name = Alex Age = 9
p2 Name = Spencer Age = 7
p1 Name = Alex Age = 9
*/
}
Stack utas mengalokasikan memori untuk baik p1 maupun p2. Program ini mengklaim kembali memori tersebut bersama dengan jenis atau metode di mana Anda mendeklarasikannya. Manajemen memori ini adalah salah satu alasan mengapa struktur disalin pada penugasan. Sebaliknya, Common Language Runtime secara otomatis mengambil kembali memori yang dialokasikannya untuk sebuah instans kelas (garbage collection) ketika semua referensi ke objek tidak lagi berada dalam cakupan. Anda tidak dapat secara deterministik menghancurkan objek kelas seperti yang Anda bisa di C++. Untuk informasi selengkapnya tentang pengumpulan sampah di .NET, lihat Pengumpulan Sampah.
Nota
Common Language Runtime (CLR) sangat mengoptimalkan alokasi dan pembebasan memori pada heap terkelola. Dalam kebanyakan kasus, tidak ada perbedaan signifikan dalam biaya performa antara alokasi instans kelas pada heap dan alokasi instans struct pada tumpukan.
Identitas objek vs. kesetaraan nilai
Saat Anda membandingkan dua objek untuk kesetaraan, pertama-tama putuskan apakah Anda ingin tahu apakah kedua variabel mewakili objek yang sama dalam memori atau jika nilai satu atau beberapa bidangnya setara. Jika Anda ingin membandingkan nilai, pertimbangkan apakah objek adalah instans jenis nilai (struct) atau jenis referensi (kelas, delegasi, array).
Gunakan metode statis Object.ReferenceEquals untuk menentukan apakah dua instans kelas merujuk ke lokasi yang sama dalam memori (yang berarti bahwa mereka memiliki identitas yang sama). (System.Object adalah kelas dasar implisit untuk semua jenis nilai dan jenis referensi, termasuk struct dan kelas yang ditentukan pengguna.)
Secara default, ValueType.Equals metode menentukan apakah bidang instans dalam dua instans struct memiliki nilai yang sama. Karena semua struktur secara implisit mewarisi dari System.ValueType, Anda memanggil metode langsung pada objek Anda seperti yang ditunjukkan dalam contoh berikut:
// Person is defined in the previous example. //public struct Person(string name, int age) //{ // public string Name { get; set; } = name; // public int Age { get; set; } = age; //} Person p1 = new("Wallace", 75); Person p2 = new("", 42); p2.Name = "Wallace"; p2.Age = 75; if (p2.Equals(p1)) Console.WriteLine("p2 and p1 have the same values."); // Output: p2 and p1 have the same values.Implementasi System.ValueType default
Equalsmenggunakan tinju dan refleksi dalam beberapa kasus. Untuk informasi tentang cara menyediakan algoritma kesetaraan yang efisien dan spesifik untuk tipe Anda, lihat Implementasikan kesetaraan sendiri ketika suatu tipe tidak dapat menjadi record. Rekaman adalah jenis referensi yang menggunakan semantik nilai untuk kesetaraan.Untuk menentukan apakah nilai bidang dalam dua instans kelas sama, Anda mungkin dapat menggunakan Equals metode atau operator ==. Namun, hanya gunakan jika kelas telah meng-override atau meng-overload mereka untuk memberikan definisi kustom tentang apa arti "kesetaraan" untuk objek jenis tersebut. Kelas juga dapat mengimplementasikan IEquatable<T> antarmuka atau IEqualityComparer<T> antarmuka. Kedua antarmuka menyediakan metode yang dapat digunakan untuk menguji kesetaraan nilai. Saat merancang kelas Anda sendiri yang meng-override
Equals, pastikan untuk mengikuti pedoman yang dijelaskan dalam Implementasikan kesetaraan sendiri ketika suatu tipe tidak dapat berupa rekaman dan Object.Equals(Object).
Bagian terkait
Untuk informasi selengkapnya, lihat: