Objek - membuat instance tipe
Definisi class atau struktur seperti cetak biru yang menentukan apa yang dapat dilakukan oleh tipe tersebut. Objek pada dasarnya adalah blok memori yang telah dialokasikan dan dikonfigurasi sesuai dengan cetak biru tersebut. Program dapat membuat banyak objek dari kelas yang sama. Objek juga disebut instance, dan dapat disimpan dalam variabel bernama atau dalam array atau collection. Kode klien adalah kode yang menggunakan variabel ini untuk memanggil method dan mengakses properti publik pada objek. Dalam bahasa berorientasi objek seperti C#, program terdiri dari objek yang berinteraksi secara dinamis.
Catatan
Tipe statis berperilaku berbeda dari apa yang dijelaskan di sini. Untuk informasi lebih lanjut, lihat Kelas Statik dan Anggota Kelas Statik.
Instance Struct vs. Instance Class
Karena class adalah tipe referensi, variabel objek kelas menyimpan referensi ke alamat objek pada tumpukan terkelola. Jika variabel kedua dengan tipe yang sama ditetapkan ke variabel pertama, maka kedua variabel merujuk ke objek di alamat tersebut. Kueri ini dibahas secara lebih rinci nanti di artikel ini.
Instance class dibuat dengan menggunakan new
operator. Dalam contoh berikut, Person
adalah tipe dan person1
dan person2
merupakan instance, atau objek, dari tipe 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 = {0} Age = {1}", person1.Name, 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 = {0} Age = {1}", person2.Name, person2.Age);
Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);
}
}
/*
Output:
person1 Name = Leopold Age = 6
person2 Name = Molly Age = 16
person1 Name = Molly Age = 16
*/
Karena struct adalah tipe nilai, variabel objek struct menyimpan salinan seluruh objek. Instance struktur juga dapat dibuat dengan menggunakan operator new
, 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 = {0} Age = {1}", p1.Name, 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 = {0} Age = {1}", p2.Name, p2.Age);
// p1 values remain unchanged because p2 is copy.
Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);
}
}
/*
Output:
p1 Name = Alex Age = 9
p2 Name = Spencer Age = 7
p1 Name = Alex Age = 9
*/
}
Memori untuk p1
dan p2
dialokasikan pada thread stack. Memori tersebut diklaim kembali bersama dengan tipe atau method di mana memori tersebut dideklarasikan. Ini adalah salah satu alasan mengapa struktur disalin pada penugasan. Sebaliknya, memori yang dialokasikan untuk instance class secara otomatis diklaim kembali (sampah dikumpulkan) oleh common language runtime ketika semua referensi ke objek telah keluar dari scope. Tidak dimungkinkan untuk secara deterministik menghancurkan objek class seperti yang Anda bisa di C++. Untuk informasi selengkapnya tentang sistem pengumpulan sampah, lihat Pengumpulan Sampah.
Catatan
Alokasi dan dealokasi memori pada tumpukan terkelola sangat dioptimalkan dalam common language runtime. Dalam kebanyakan kasus, tidak ada perbedaan signifikan dalam biaya performa mengalokasikan instance class pada stack versus mengalokasikan instance 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 instance dari tipe nilai (struct) atau tipe referensi (kelas, delegasi, array).
Untuk menentukan apakah dua instance class merujuk ke lokasi yang sama dalam memori (yang berarti bahwa instance tersebut memiliki identitas yang sama), gunakan method statis Object.Equals. (System.Object adalah class dasar implisit untuk semua tipe nilai dan tipe referensi, termasuk struktur dan class yang ditentukan pengguna.)
Untuk menentukan apakah bidang instance dalam dua instance struct memiliki nilai yang sama, gunakan method ValueType.Equals. Karena semua struktur secara implisit mewarisi dari System.ValueType, Anda memanggil method 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
menggunakan boxing dan reflection dalam beberapa kasus. Untuk informasi tentang cara memberikan algoritma kesetaraan efisien yang khusus untuk tipe, lihat Cara menentukan kesetaraan nilai untuk tipe. Record adalah tipe referensi yang menggunakan semantik nilai untuk kesetaraan.Untuk menentukan apakah nilai bidang dalam dua instance class sama, Anda mungkin dapat menggunakan method Equals atau operator == . Namun, hanya gunakan jika class telah override atau overload untuk memberikan definisi kustom tentang apa arti "equality" untuk objek tipe tersebut. Class mungkin juga mengimplementasikan antarmuka IEquatable<T> atau antarmuka IEqualityComparer<T>. Kedua antarmuka menyediakan method yang dapat digunakan untuk menguji kesetaraan nilai. Saat merancang class Anda sendiri yang override
Equals
, pastikan untuk mengikuti pedoman yang dinyatakan dalam Cara menentukan kesetaraan nilai untuk tipe dan Object.Equals(Object).
Bagian Terkait
Untuk informasi selengkapnya:
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk