Comment : implémenter une classe Lightweight avec des propriétés implémentées automatiquement (Guide de programmation C#)

Cet exemple montre comment créer une classe légère immuable qui sert uniquement à encapsuler un jeu de propriétés implémentées automatiquement.Utilisez ce type de construction à la place d'un struct lorsque vous devez utiliser une sémantique de type référence.

Notez qu'avec les propriétés implémentées automatiquement, les accesseurs get et set sont obligatoires.Vous rendez la classe immuable en déclarant private les accesseurs set .Toutefois, lorsque vous déclarez private un accesseur set, vous ne pouvez pas utiliser un initialiseur d'objet pour initialiser la propriété.Vous devez utiliser un constructeur ou une méthode de fabrique.

Exemple

L'exemple suivant affiche deux façons d'implémenter une classe immuable qui a implémenté automatiquement des propriétés.La première classe utilise un constructeur pour initialiser les propriétés, et la deuxième classe utilise une méthode de fabrique statique.


    // 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; private set; }
        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 set; }

        // 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.
*/

Le compilateur crée des champs de stockage pour chaque propriété implémentée automatiquement.Les champs ne sont pas directement accessibles depuis le code source.

Voir aussi

Référence

Propriétés (Guide de programmation C#)

struct (Référence C#)

Initialiseurs d'objets et de collection (Guide de programmation C#)