プロパティによるカプセル化[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#は浅い所しかできないよね…)
- JavaのアクセサーとC#のプロパティ
- プロパティの基本の書き方
- 読取専用プロパティ
- 書込専用プロパティ
- 読み書き可能プロパティ
- C# 6.0 以降版 読取専用プロパティ
- C# 6.0 以降 自動プロパティ初期化子
- C# 7.0 以降 に出来るプロパティの書き方
- 終わりに
プロパティの基本の書き方
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プロパティは使われる.
並列処理などするときにimmutableかどうかは考慮に入れるべきことだね.
ローカル変数のreadonly
C# 8.0 以降だと こんな書き方が出来る.面白い.
using var a = new DeferredMessage("a");
ローカル変数ね.
書込専用プロパティ
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がくるらしい….早いな….
基礎からしっかり学ぶC#の教科書 改訂新版 (マイクロソフト関連書)
- 作者:WINGSプロジェクト 髙江 賢
- 発売日: 2019/12/20
- メディア: 単行本
この本,発売日に購入したけど,結局12月~2月は残業ばかりでやる時間が取れなかったけども,
ちゃんとやりまぁす….