Implement a Lightweight Class with Auto-Implemented Properties


Contoh ini menunjukkan bagaimana membuat class lighweight yang tidak berubah yang hanya berfungsi untuk merangkum serangkaian properti yang diimplementasikan secara otomatis. Gunakan semacam ini membangun bukan struct ketika kita harus menggunakan type referensi semantik. Kita bisa membuat properti yang tidak berubah dalam dua cara. Kita bisa mendeklarasikan accessor.menjadi private. Properti ini hanya dapat diatur dalam type, namun tidak dapat diubah ke Consumers. Kita malah bisa menyatakan hanya mendapatkan accessor, yang membuat properti tidak berubah di mana-mana kecuali konstruktor type itu. Saat kita mendeklarasikan accessor private, Kita tidak dapat menggunakan penginisialisasi objek untuk menginisialisasi properti. Kita harus menggunakan metod Constructor atau method factory.
Contoh
Contoh berikut menunjukkan dua cara untuk menerapkan class yang tidak berubah yang memiliki properti yang diimplementasikan secara otomatis. Setiap cara menyatakan salah satu properti dengan satu set private dan salah satu properti dengan hanya get. Class pertama menggunakan constructor hanya untuk menginisialisasi properti, dan class kedua menggunakan metod factory statis yang memanggil constructor.
// 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 properties.   
        public string Name { get; }  
        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-only properties.   
        public string Name { get; private set; }  
        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";   

            // Keep the console open in debug mode.  
            Console.WriteLine("Press any key to exit.");  
            Console.ReadKey();                  
        }  
    }  

/* 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.  
*/  
Compiler menciptakan field backing untuk setiap properti yang diimplementasikan secara otomatis. Field tidak dapat diakses langsung dari source code.
Previous
Next Post »