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 プロパティを読み取り専用にしています。

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門