Bagikan melalui


Objek - menciptakan instance dari jenis

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

Untuk informasi selengkapnya: