Gewusst wie: Implementieren einer einfachen Klasse mit automatisch implementierten Eigenschaften (C#-Programmierhandbuch)How to: Implement a Lightweight Class with Auto-Implemented Properties (C# Programming Guide)

In diesem Beispiel wird das Erstellen einer unveränderlichen einfachen Klasse gezeigt, die nur zum Kapseln einer Reihe von automatisch implementierten Eigenschaften dient.This example shows how to create an immutable lightweight class that serves only to encapsulate a set of auto-implemented properties. Verwenden Sie diese Konstruktart anstelle einer Struktur, wenn Sie eine Verweistypsemantik verwenden müssen.Use this kind of construct instead of a struct when you must use reference type semantics.

Für das Erstellen einer unveränderlichen Eigenschaft gibt es zwei Möglichkeiten.You can make an immutable property in two ways. Sie können deklarieren, dass die Set-Zugriffsmethode privat ist.You can declare the set accessor.to be private. Die Eigenschaft kann nur im Typ festgelegt werden. Kunden können sie jedoch nicht verändern.The property is only settable within the type, but it is immutable to consumers. Sie können stattdessen einfach die Get-Zugriffsmethode deklarieren. Dieser macht die Eigenschaft mit Ausnahme im Konstruktor des Typs überall unveränderlich.You can instead declare only the get accessor, which makes the property immutable everywhere except in the type’s constructor.

Beim Deklarieren eines privaten set-Accessors können Sie einen Objektinitialisierer nicht verwenden, um die Eigenschaft zu initialisieren.When you declare a private set accessor, you cannot use an object initializer to initialize the property. Sie müssen eine Konstruktor oder eine Factorymethode verwenden.You must use a constructor or a factory method.

BeispielExample

Im folgenden Beispiel werden zwei Möglichkeiten für die Implementierung einer unveränderlichen Klasse gezeigt, die über automatisch implementierte Eigenschaften verfügt.The following example shows two ways to implement an immutable class that has auto-implemented properties. Mit beiden Möglichkeiten wird jeweils eine der Eigenschaften mit einer privaten set und eine der Eigenschaft mit einer get deklariert.Each way declares one of the properties with a private set and one of the properties with a get only. Die erste Klasse verwendet einen Konstruktor nur zum Initialisieren der Eigenschaften, und die zweite Klasse verwendet eine statische Factorymethode, die einen Konstruktor aufruft.The first class uses a constructor only to initialize the properties, and the second class uses a static factory method that calls a 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.  
*/  

Der Compiler erstellt Unterstützungsfelder für jede automatisch implementierte Eigenschaft.The compiler creates backing fields for each auto-implemented property. Es ist nicht möglich, über den Quellcode direkt auf die Felder zuzugreifen.The fields are not accessible directly from source code.

Siehe auchSee Also

EigenschaftenProperties
structstruct
Objekt- und AuflistungsinitialisiererObject and Collection Initializers