プロパティによるカプセル化[C#]

JavaのアクセサーとC#のプロパティ

Javaにはアクセサーという機能があり,
内部のフィールドはprivateアクセスとして外部から直接変更されないようにしつつ,
操作をメソッド経由で出来るようにしている.getter/setter.以下のような感じ.

private String name;

public String getName(){
    return name;
}

public void setName(String name){
    this.name = name;
}

IDEでフィールドから自動生成できなかったら,ブチ切れるほど冗長だよねぶっちゃけこれ)

これに対して,C#はプロパティという機能があり,
メンバ変数宣言とJavaアクセサーが合体したような書き方になっている.

public string Name { get; set; }

JavaのアクセサーもC#のプロパティの手法は,
OOPカプセル化を促進するものなので,推奨される書き方になります.

業務でJavaばっかり使っていて,C#の知識が曖昧になっているので,C#の知識整理.
(UnityばっかりイジっているC#は浅い所しかできないよね…)

プロパティの基本の書き方

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    get { return myInt; }
    set { myInt = value; }
}

プロパティの命名規則として,private パッキングフィールドの名前の先頭文字に対応する大文字に置換する.
ここのvalueはプロパティが持つ暗黙のパラメタで,値設定時に利用される.

読取専用プロパティ

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    get { return myInt; }
}

immutable型の作成時にreadonlyプロパティは使われる.

immutableufcpp.wordpress.com

並列処理などするときにimmutableかどうかは考慮に入れるべきことだね.

ローカル変数のreadonly

C# 8.0 以降だと こんな書き方が出来る.面白い.

using var a = new DeferredMessage("a");

qiita.com

ローカル変数ね.

書込専用プロパティ

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    set { myInt = value; }
}

読み書き可能プロパティ

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    get { return myInt; }
    set { myInt = value; }
}

上のコードは以下のように簡略化できる.

public int MyInt { get; set; }

自動プロパティ宣言だとか自動実装プロパティとも呼ばれる.

C# 6.0 以降版 読取専用プロパティ

private double radius = 10;
public double Radius {
    get { return radius; }
}

上は以下のように書ける.

private double radius = 10;
public double Radius => radius;

式形式プロパティとか式本体プロパティとも呼ばれる.

C# 6.0 以降 自動プロパティ初期化子

以下のような書き方が出来るっぽいけどキモイなこれ….

public int MyInt2 { get; set; } = 25; 

setアクセサを削除すれば,readonlyになる.

C# 7.0 以降 に出来るプロパティの書き方

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    get { return myInt; }
    set { myInt = value; }
}

これが

private int myInt; // private パッキングフィールド
public int MyInt // public プロパティ
{
    get => myInt;
    set => myInt = value;
}

こうじゃ!
シンタックスシュガーっぽい書き方しかしたくない.

終わりに

これからもうちっとC#をガッツリ深く学ぶ時間取る.
そろそろC#9.0がくるらしい….早いな….

この本,発売日に購入したけど,結局12月~2月は残業ばかりでやる時間が取れなかったけども,
ちゃんとやりまぁす….