方法: 自動実装するプロパティを使用して簡易クラスを実装する (C# プログラミング ガイド)How to: Implement a Lightweight Class with Auto-Implemented Properties (C# Programming Guide)

この例では、一連の自動実装プロパティのカプセル化のみを行う、変更できない簡易クラスの作成方法を示します。This example shows how to create an immutable lightweight class that serves only to encapsulate a set of auto-implemented properties. 参照型のセマンティクスを使用する必要がある場合は、構造体ではなく次のようなコンストラクトを使用します。Use this kind of construct instead of a struct when you must use reference type semantics.

変更できないプロパティの作成方法は 2 つあります。You can make an immutable property in two ways:

  • set アクセサーは、private として宣言することができます。You can declare the set accessor to be private. プロパティは型の中のみで設定可能で、コンシューマーは変更できません。The property is only settable within the type, but it is immutable to consumers.

    set アクセサーを private で宣言した場合、オブジェクト初期化子を使用してプロパティを初期化することはできません。When you declare a private set accessor, you cannot use an object initializer to initialize the property. コンストラクターまたはファクトリ メソッドを使用する必要があります。You must use a constructor or a factory method.

  • get アクセサーのみを宣言し、型のコンストラクターを除くすべての場所でプロパティを変更できないようにすることができます。You can declare only the get accessor, which makes the property immutable everywhere except in the type’s constructor.

Example

次の例は、自動実装プロパティを持つ変更できないクラスを実装する 2 つの方法を示します。The following example shows two ways to implement an immutable class that has auto-implemented properties. それぞれの方法では、プロパティの 1 つを private set で、1 つを get のみで宣言します。Each way declares one of the properties with a private set and one of the properties with a get only. 最初のクラスはプロパティの初期化にコンストラクターのみを使用しますが、2 番目のクラスは、コンストラクターを呼び出す静的ファクトリ メソッドを使用します。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.
*/

コンパイラによって、各自動実装プロパティにバッキング フィールドが作成されます。The compiler creates backing fields for each auto-implemented property. このフィールドは、ソース コードから直接アクセスできません。The fields are not accessible directly from source code.

関連項目See also