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 pada dasarnya adalah blok memori yang telah dialokasikan dan dikonfigurasi sesuai dengan cetak biru. Program dapat membuat banyak objek dari kelas yang sama. Objek juga disebut instans, dan dapat disimpan dalam variabel bernama atau dalam array atau koleksi. Kode klien adalah kode yang 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 di sini. Untuk informasi lebih lanjut, lihat Kelas Statik dan Anggota Kelas Statik.
Instans Struct vs. Instans Kelas
Karena kelas adalah jenis referensi, variabel objek kelas menyimpan referensi ke alamat objek pada tumpukan terkelola. Jika variabel kedua dari jenis yang sama ditetapkan ke variabel pertama, maka kedua variabel merujuk ke objek di alamat tersebut. Poin ini dibahas secara lebih rinci nanti di artikel ini.
Instans kelas dibuat 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
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
// Other properties, methods, events...
}
class Program
{
static void Main()
{
Person person1 = new Person("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. Instans struktur juga dapat dibuat dengan menggunakan new
operator, tetapi ini tidak diperlukan, 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 Person("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
*/
}
Memori untuk p1
dan p2
dialokasikan di tumpukan thread. Memori tersebut diklaim kembali bersama dengan jenis atau metode di mana memori tersebut dideklarasikan. Ini adalah salah satu alasan mengapa struktur disalin pada penugasan. Sebaliknya, memori yang dialokasikan untuk instans kelas secara otomatis direklamasi kembali (sampah dikumpulkan) oleh runtime bahasa umum ketika semua referensi ke objek telah keluar dari cakupan. Tidak dimungkinkan untuk secara deterministik menghancurkan objek kelas seperti yang Anda bisa di C++. Untuk informasi selengkapnya tentang pengumpulan sampah di .NET, lihat Pengumpulan Sampah.
Nota
Alokasi dan dealokasi memori pada heap terkelola sangat dioptimalkan dalam runtime bahasa umum. Dalam kebanyakan kasus, tidak ada perbedaan signifikan dalam biaya kinerja alokasi instans kelas pada heap versus mengalokasikan instans struct pada stack.
Identitas Objek vs. Kesetaraan Nilai
Ketika Anda membandingkan dua objek untuk kesetaraan, Anda harus terlebih dahulu membedakan apakah Anda ingin tahu apakah kedua variabel mewakili objek yang sama dalam memori, atau apakah nilai satu atau beberapa bidangnya setara. Jika Anda ingin membandingkan nilai, Anda harus mempertimbangkan apakah objek tersebut adalah instans jenis nilai (struct) atau jenis referensi (kelas, delegasi, array).
Untuk menentukan apakah dua instans kelas merujuk ke lokasi yang sama dalam memori (yang berarti bahwa instans tersebut memiliki identitas yang sama), gunakan metode statis Object.Equals . (System.Object adalah kelas dasar implisit untuk semua jenis nilai dan jenis referensi, termasuk struct dan kelas yang ditentukan pengguna.)
Untuk menentukan apakah bidang instans dalam dua instans struct memiliki nilai yang sama, gunakan metode ValueType.Equals. 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 //{ // public string Name; // public int Age; // public Person(string name, int age) // { // Name = name; // Age = age; // } //} Person p1 = new Person("Wallace", 75); Person p2 = new Person("", 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
Equals
penggunaan tinju dan refleksi dalam beberapa kasus. Untuk informasi tentang cara memberikan algoritma kesetaraan efisien yang khusus untuk jenis Anda, lihat Cara menentukan kesetaraan nilai untuk jenis. 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 mengambil alih
Equals
, pastikan untuk mengikuti pedoman yang dinyatakan dalam Cara menentukan kesetaraan nilai untuk jenis dan Object.Equals(Object).
Bagian Terkait
Untuk informasi selengkapnya: