C# の自動実装プロパティ
C# の自動実装プロパティとは?
まずは基本的なプロパティの実装方法をおさらいしましょう。
次の例では Person クラスを定義しています。ここでは public プロパティ Name、Age を定義しています。
using System;
class Person
{
private string name;
private int age;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
}
class Program
{
static void Main(string[] args)
{
var p = new Person()
{
Name = "Taro Yamada",
Age = 30
};
Console.WriteLine($"{p.Name} ({p.Age})");
}
}
get, set を用いて、プロパティに関連付けされるプライベートフィールド name, age に値をセットしたり、値を取得したりしています。 set には自動的に、新しい値を表す value という値が渡されます。
さて、このように get, set (まとめてアクセサといいます)に特別なロジックが必要ない場合、次のように記述することが可能です。
using System;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
var p = new Person()
{
Name = "Taro Yamada",
Age = 30
};
Console.WriteLine($"{p.Name} ({p.Age})");
}
}
プロパティ Name と Age は 5-6行目にとても簡潔に記述されています。
このような記述を許可するのが、自動実装プロパティ (auto-implemented properties) という機能です。
get や set の中身を何も書かなかった場合、単純に値を受け渡しするものとして、C# が自動的にプロパティを実装してくれます。
読み取り専用の自動実装プロパティの作成
プロパティはしばしば、一度初期化した後は読み取り専用にするなどして、内部データを保護したい場合があります。
こうした場合、自動実装プロパティでどのように記述すればよいでしょうか。
実は非常に簡単です。
次のように set を private と指定することによって、読み取り専用プロパティとすることが可能です。
using System;
class Person
{
public string Name { get; private set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main(string[] args)
{
var p = new Person("Taro Yamada", 30);
Console.WriteLine($"{p.Name} ({p.Age})");
}
}
5行目で Name プロパティを読み取り専用にしています。
なお、これがどのような仕組みとして実装されているのか、ということについては、 「自動実装プロパティの仕組み」を参考にしてください。