Bagikan melalui


Cara menerapkan kelas ringan dengan properti yang diterapkan otomatis (Panduan Pemrograman C#)

Contoh ini menunjukkan cara membuat kelas ringan yang tidak dapat diubah yang hanya berfungsi untuk merangkum satu set properti yang diimplementasikan secara otomatis. Gunakan konstruksi semacam ini alih-alih struktur ketika Anda harus menggunakan semantik jenis referensi.

Anda dapat membuat properti yang tidak dapat diubah dengan cara berikut:

  • Nyatakan hanya mendapatkan aksesor, yang membuat properti tidak dapat diubah di mana-mana kecuali di konstruktor jenis.
  • Deklarasikan aksesor init alih-alih aksesor set, yang membuat properti hanya dapat diatur di konstruktor atau dengan menggunakan penginisialisasi objek.
  • Nyatakan aksesor yang ditetapkan menjadi privat. Properti dapat diatur dalam jenis , tetapi tidak dapat diubah oleh konsumen.

Anda dapat menambahkan pengubah required ke deklarasi properti untuk memaksa penelepon mengatur properti sebagai bagian dari menginisialisasi objek baru.

Contoh berikut menunjukkan bagaimana properti dengan hanya mendapatkan aksesor berbeda dari yang memiliki get dan private set.

class Contact
{
    public string Name { get; }
    public string Address { get; private set; }

    public Contact(string contactName, string contactAddress)
    {
        // Both properties are accessible in the constructor.
        Name = contactName;
        Address = contactAddress;
    }

    // Name isn't assignable here. This will generate a compile error.
    //public void ChangeName(string newName) => Name = newName;

    // Address is assignable here.
    public void ChangeAddress(string newAddress) => Address = newAddress;
}

Contoh

Contoh berikut menunjukkan dua cara untuk mengimplementasikan kelas yang tidak dapat diubah yang memiliki properti yang diterapkan secara otomatis. Setiap cara mendeklarasikan salah satu properti dengan privat set dan salah satu properti dengan satu-satunya get. Kelas pertama menggunakan konstruktor hanya untuk menginisialisasi properti, dan kelas kedua menggunakan metode pabrik statis yang memanggil konstruktor.

// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// constructor to initialize its properties.
class Contact
{
    // Read-only property.
    public string Name { get; }

    // Read-write property with a private set accessor.
    public string Address { get; private set; }

    // Public constructor.
    public Contact(string contactName, string contactAddress)
    {
        Name = contactName;
        Address = contactAddress;
    }
}

// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{
    // Read-write property with a private set accessor.
    public string Name { get; private set; }

    // Read-only property.
    public string Address { get; }

    // Private constructor.
    private Contact2(string contactName, string contactAddress)
    {
        Name = contactName;
        Address = contactAddress;
    }

    // Public factory method.
    public static Contact2 CreateContact(string name, string address)
    {
        return new Contact2(name, address);
    }
}

public class Program
{
    static void Main()
    {
        // Some simple data sources.
        string[] names = ["Terry Adams","Fadi Fakhouri", "Hanying Feng",
                            "Cesar Garcia", "Debra Garcia"];
        string[] addresses = ["123 Main St.", "345 Cypress Ave.", "678 1st Ave",
                                "12 108th St.", "89 E. 42nd St."];

        // Simple query to demonstrate object creation in select clause.
        // Create Contact objects by using a constructor.
        var query1 = from i in Enumerable.Range(0, 5)
                    select new Contact(names[i], addresses[i]);

        // List elements cannot be modified by client code.
        var list = query1.ToList();
        foreach (var contact in list)
        {
            Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
        }

        // Create Contact2 objects by using a static factory method.
        var query2 = from i in Enumerable.Range(0, 5)
                        select Contact2.CreateContact(names[i], addresses[i]);

        // Console output is identical to query1.
        var list2 = query2.ToList();

        // List elements cannot be modified by client code.
        // CS0272:
        // list2[0].Name = "Eugene Zabokritski";
    }
}

/* Output:
    Terry Adams, 123 Main St.
    Fadi Fakhouri, 345 Cypress Ave.
    Hanying Feng, 678 1st Ave
    Cesar Garcia, 12 108th St.
    Debra Garcia, 89 E. 42nd St.
*/

Pengompilasi membuat bidang dukungan untuk setiap properti yang diimplementasikan secara otomatis. Bidang tidak dapat diakses langsung dari kode sumber.

Lihat juga