Bagikan melalui


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.ValueTypeEquals 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).

Untuk informasi selengkapnya: