search
LoginSignup
243
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

プロパティ?フィールド?メンバー?C#のクラス構造のおさらい

概要

C#のクラス構成要素。プロパティだったり、フィールドだったりどれがどれだかわからなくなってきたのでまとめます。
バージョン毎に使える書き方もあるようなので、それも補足情報としてのっけます。

本題

サンプル


public class Person {
    public string Name { get; set; }

    private double _weight; // 1. フィールド
    public double Weight{ // 3. プロパティ
        get { return _weight; }
        set {
            if (value > 0)
                _weight = value;
        }
    }

    private double _height;
    public double Height {
        get { return _height; }
        set {
            if (value > 50)
                _height = value;
    }

    public DateTime Birthday { get; set; }

    public Person(string name, DateTime birthday) { // 4. コンストラクタ
        Name = name;
        Birthday = birthday;
    }

    public double GetBmi() { // 2. メソッド
        double mh = Height / 100.0;
        return Weight / (mh * mh);
    }
}

1. フィールド

  • オブジェクト指向について「クラスは、データと振る舞いをカプセル化したものである」と説明されるときの「データ」の部分です。
  • オブジェクトが持つデータをフィールドとして定義します。
  • フィールドはクラスのメンバ(クラスなど、型を構成する内部要素の総称)として宣言された変数で、インスタンスと直接結び付けられます。
  • メンバ変数とも呼ばれます。
  • フィールドはインスタンスからアクセスします。
  • 非公開にし、プロパティで操作するのが原則です。
  • フィールドと3.プロパティの混乱を避けるためにアンダースコア(_)をつけて定義することがあります。

2. メソッド

  • オブジェクト指向について「クラスは、データと振る舞いをカプセル化したものである」と説明されるときの「振る舞い」の部分です。
  • メソッドは、一連のステートメントが含まれているコードブロックです。
  • 必要なメソッド引数を指定してプログラムからメソッドを呼び出すと、メソッド内のステートメントが実行されます。
  • Mainメソッドは、すべての C#アプリケーションのエントリ ポイントです。プログラムが開始されると、このメソッドが共通言語ランタイム (CLR) によって呼び出されます。

3. プロパティ

  • オブジェクト内にあるフィールドの値を取得、または設定するための手段です。
  • クラス外部から見るとメンバー変数のように振る舞い、 クラス内部から見るとメソッドのように振舞います。
  • メンバー変数の値の取得・変更を行うためのメソッドのことをアクセサー(accessor)といいます。
  • setterに渡す値にはsetter内からvalueという変数でアクセスできます。

C#3.0

  • プロパティのset/getの中身を省略できるようになりました。この機能を自動プロパティといいます。 サンプルの public string Name { get; set; }
private string _name;
public string Name
{
  get { return _name; }
  set { _name = value; }
}

と同意です。

C#6.0

  • 自動プロパティ初期化子を与えて、初期値指定ができるようになりました。

public string Name { get; set; } = "Nyanchu"

以下と同意です。


private string _name = "Nyanchu";

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

4. コンストラクタ

  • クラスのインスタンスが生成されるときに自動的に呼び出され、初期化を実行します。
  • 明示的に定義しない場合は引数を持たないコンストラクタ(デフォルト・コンストラクタ)が自動的に定義され、呼び出されます。
  • サンプルのように引数付きのコンストラクタを定義する(コンストラクタのオーバーロード)と、デフォルト・コンストラクタを使ってインスタンスを生成することができなくなります。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
243
Help us understand the problem. What are the problem?