133. 案1"防御的コピーをする
public class Player {
/*略*/
private List<Item> items;
public List<Item> Items { get { return new List<Item>(items); } }
}
内部のリストメンバの複製を外部に公開する
けれど、これだと「クラス内のアイテムのリストのデータはいじれなよ」「防御的コピーしたよ」
ってことがぱっと見で伝わらない。Playerクラスのコード'or'ドキュメントを読まないといけない
134. 案2"プロパティをIEnumerable<T>型にする
public class Player {
/*略*/
private List<Item> items;
public IEnumerable<Item> Items { get { return items; } }
}
「いじれないよ」ということは伝わるけれど、「確定しているデータだよ」が伝わらない
「遅延評価される値?」「内部ではリスト・配列で保持せずDBにいちいち問い合わせてる?」
って勘違いされる可能性あり。結局Playerクラスのコードかドキュメントを読まないといけない
135. 案3"プロパティをIReadOnlyList<T>型にする
public class Player {
/*略*/
private List<Item> items;
public IReadOnlyList<Item> Items { get { return items; } }
}
「外部からだといじれないよ」も「遅延評価じゃなくて確定しているデータだよ」も伝わる
【悲報】だけどUnityだと使えない【致命的】
.NET%4.5で登場したインターフェースだからorz
138. 案4"プロパティをReadOnlyCollec.on<T>型にする
public class Player {
/*略*/
private List<Item> items;
public ReadOnlyCollection<Item> Items {
get { return new ReadOnlyCollection<Item>(items); }
}
}
もしくは、(意味は変わってくるけれど)
public class Player {
/*略*/
public ReadOnlyCollection<Item> Items { get ; private set; }
}