方法: 読み取り/書き込みプロパティを宣言および使用する (C# プログラミング ガイド)
プロパティは、オブジェクトのデータへの保護されていない、制御されず未確認のアクセスに伴うリスクなしにパブリック データ メンバーの利便性を提供します。このような機能は、アクセサーを通じて実現されます。アクセサーは、基になるデータ メンバーの値を割り当てたり、取得したりする特殊なメソッドです。set アクセサーは、データ メンバーの割り当てを可能にし、get アクセサーは、データ メンバーの値を取得します。
次の例は、Name (string 型) と Age (int 型) の 2 つのプロパティを持つ Person クラスを示しています。次のプロパティは共に get アクセサーと set アクセサーを備えているので、読み書き可能プロパティと見なされます。
使用例
class Person
{
private string name = "N/tcA";
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;
}
}
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/tcA, 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;
}
}
また、一方のアクセサーをパブリックに公開し、もう一方をプライベートまたはプロテクトにすることもできます。詳細については、「非対称アクセサーのアクセシビリティ (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 呼び出しによって呼び出されます。