読み取り/書き込みプロパティを宣言および使用する方法 (C# プログラミング ガイド)

プロパティは、オブジェクトのデータへの保護されていない、制御されず未確認のアクセスに伴うリスクなしにパブリック データ メンバーの利便性を提供します。 プロパティによって "アクセサー" が宣言されます。これは、基になるデータ メンバーの値を割り当てたり、取得したりする特殊なメソッドです。 set アクセサーはデータ メンバーの割り当てを可能にし、get アクセサーはデータ メンバーの値を取得します。

このサンプルでは、Name (string) および Age (int) という 2 つのプロパティを持つ Person クラスを示します。 両方のプロパティは get および set アクセサーを提供するため、読み取り/書き込みプロパティと見なされます。

class Person
{
    private string _name = "N/A";
    private int _age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return _age;
        }

        set
        {
            _age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

信頼性の高いプログラミング

前述の例では、Name および Age プロパティはパブリックであり、get および set アクセサーの両方が含まれます。 パブリック アクセサーによって任意のオブジェクトはこれらのプロパティを読み書きできます。 ただし、アクセサーのいずれかを除外することが望ましい場合もあります。 set アクセサーを省略し、プロパティを読み取り専用にできます。

public string Name
{
    get
    {
        return _name;
    }
    private set
    {
        _name = value;
    }
}

また、一方のアクセサーをパブリックに公開し、もう一方を private または protected にすることもできます。 詳細については、「アクセサーのアクセシビリティの制限 (C# プログラミング ガイド)」を参照してください。

プロパティを宣言すると、プロパティをクラスのフィールドとして使用できます。 プロパティでは、プロパティ値の取得と設定の両方で、次のように自然な構文を使用できます。

person.Name = "Joe";
person.Age = 99;

プロパティの set メソッドでは、特殊な value 変数を使用できます。 この変数には、ユーザーが指定した値が含まれます。たとえば、次のように指定します。

_name = value;

Person オブジェクトの Age プロパティの値を増分する場合は、次のような簡潔な構文を使用します。

person.Age += 1;

set メソッドと get メソッドがそれぞれ使用されてプロパティがモデル化されている場合、上記と同じ内容のコードは次のようになります。

person.SetAge(person.GetAge() + 1);

この例では、ToString メソッドが次のようにオーバーライドされます。

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

プログラムでは ToString が明示的に使用されないことに注意してください。 既定では、WriteLine 呼び出しによって呼び出されます。

関連項目