はじめに
C#を学習する上でつまずきやすいポイントの一つに「フィールド」と「プロパティ」の違いがあるかと思います。
この記事では、フィールドとプロパティの違いと使い方を、初心者の方にもわかりやすく丁寧に解説していきます。
フィールドとは?
フィールドとは、クラスの中で定義する変数のことで、オブジェクトが持つデータを保存するために使います。
フィールドの定義は以下のように記述します。
public class Person
{
private string name = ""; // フィールド
}
このコードでは、Person
クラスにname
というフィールドが定義されています。
フィールドの注意点
フィールドはpublic
でも定義できますが、private
にしておき、外部から直接アクセスさせないのが一般的です。
以下は、フィールドをpublic
で定義した場合の一例です。
class Person
{
public int age;
}
class Program
{
static void Main() {
Person p = new Person();
p.age = -10; // 不正な値も代入できてしまう
}
}
publicにしておくと外部からの直接アクセスや変更が可能になり、予期せず値を変更されてしまうリスクがあります。
プロパティとは?
プロパティとは、フィールドへのアクセスを制御するための仕組みのことです。
get
とset
を記述し、値の取得や設定を行います。
プロパティの定義は以下のように記述します。
public class Person
{
private string name = ""; // フィールド
public string Name // プロパティ
{
get { return name; }
set { name = value; }
}
}
なぜプロパティを使うの?
- カプセル化を実現できる
- getter/setterで値の取得・設定を制御し、カプセル化によってクラスの内部構造を隠すことで、安全にデータを扱えるようにしています。
- ロジックを追加できる
- プロパティにロジックを追加することで、変数に意図しない値が設定されることを防いだり、値の取得や設定の際に特定の処理を行わせることができます。
例えば、変数age(年齢)にマイナスの値を設定されたくないときは、以下のようなロジックが考えられます。Person.cspublic class Person { private int age; // フィールド public int Age // プロパティ { get { return age; } set { if (value >= 0) age = value; } } }
自動実装プロパティとは?
C#ではプロパティの実装が一般的であることから、「自動実装プロパティ」という簡略構文が用意されています。
public class Person
{
public string Name { get; set; }
}
自動実装プロパティでは、フィールドを定義することなくName
プロパティを利用することができます。
シンプルなデータ保持で、ロジックが不要な場合に便利です。
読み取り専用/書き込み専用のプロパティ
プロパティはアクセサの組み合わせで、読み取り専用/書き込み専用にすることも可能です。
public class Person
{
public string Name { get; } // 読み取り専用
public int Age { private get; set; } // 書き込み専用
}
フィールドとプロパティの違い
以下の表にフィールドとプロパティの主な違いをまとめてみました。
項目 | フィールド | プロパティ |
---|---|---|
アクセス | 直接 | 間接(getter/setterを経由) |
カプセル化 | 弱い | 強い |
制御の可否 | 実装不可 | 実装可能(バリデーションなど) |
利用目的 | 内部データ保持 | 外部への公開、制御付きアクセス |
拡張性 | 低い | 高い(ロジックの追加が可能) |
どうやって使い分ける?
フィールドとプロパティは次のような使い分けが基本です。
一時的なデータとしてクラス内だけで使う ⇒ フィールド(private)
外部からデータの読み書きを行う ⇒ プロパティ(public + 制御)
一般的には 「フィールドはprivateにして、プロパティを介してアクセスさせる」 のが推奨されます。
おわりに
ここまでC#のフィールドとプロパティについて説明してきました。
フィールドとプロパティの違いについて理解しておくことで、より安全で保守のしやすいコードが書けるようになります。
この記事がフィールドとプロパティの部分でつまづいている初心者の方の助けになれば幸いです!