C# 入門

ホーム > C# の基礎 > 自動実装プロパティとは?

自動実装プロパティとは?

C# 3.0 以降では自動実装プロパティ (auto-implemented properties) が導入され、クラスを簡潔に記述できるようになりました。

暗黙的型指定ローカル変数 var匿名型 に引き続き、自動実装プロパティ。

いろいろと新しい機能が導入され、「あれ?よく見ると、これなんだ?」 ということが起こりがちです。

ひとつひとつ、しっかり整理していきましょう。

ここでは自動実装プロパティについてみていきます。

自動実装プロパティとは?

まずは基本的なプロパティの実装方法をおさらいしましょう。

次の例では Person クラスを定義しています。ここでは public プロパティ Name、Age を定義しています。

using System;

namespace ImplProps
{
	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("{0} ({1})", p.Name, p.Age);
		}
	}
}

get, set を用いて、プロパティに関連付けされるプライベートフィールド name, age に値をセットしたり、値を取得したりしています。 set には自動的に value という値が渡されるのでしたね。

さて、このように get, set (まとめてアクセサといいます)に特別なロジックが必要ない場合、次のように記述することが可能です。

using System;

namespace AutoImplProps1
{
	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("{0} ({1})", p.Name, p.Age);
		}
	}
}

プロパティ Name と Age が単に次のように記述されています。

	public string Name { get; set; }
	public int Age { get; set; }

このような記述を許可するのが、自動実装プロパティ (auto-implemented properties) という機能です。

コード上では何も書かなかった場合、上のコードのように単純に値を受け渡しするものとして、C# が自動的にプロパティを実装してくれる、というわけです。

自動実装プロパティで読み取り専用にするには?

プロパティはしばしば、一度初期化した後は読み取り専用にするなどして、内部データを保護したい場合があります。

こうした場合、自動実装プロパティでどのように記述すればよいでしょうか。

実は非常に簡単です。

次のように set を private と指定することによって、読み取り専用プロパティとすることが可能です。

using System;

namespace AutoImplProps2
{
	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("{0} ({1})", p.Name, p.Age);
		}
	}
}

ここでは Name プロパティを読み取り専用としました。

Visual Studio 上でも次のようにアクセス不可であることが確認できますね。

自動実装プロパティ

なお、これがどのような仕組みとして実装されているのか、ということについては、 「自動実装プロパティの仕組み」を参考にしてください。

ホーム > C# の基礎 > 自動実装プロパティとは?