http://blogs.wankuma.com/shuujin/archive/2006/12/22/52977.aspx
盛り上がりをみせたこの問題。いろいろな意見があったが、結局のところ、当然違いはあるのだから、迷うぐらいなら取り敢えずプロパティにしておけば間違いないだろう。
適切なジャッジができるなら、フィールド公開の世界へようこそ。
さて、私の記事を読んで「なんだ、プロパティにするのメンドクセ。プロパティ内で何も処理していないし、フィールド公開しちゃえ」と万が一にでも思った人のために補足しておく。
using System;
using System.Drawing;
public class TestClass1 {
public Point Point;
}
public class TestClass2 {
private Point _point;
public Point Point {
get {
return _point;
}
set {
_point = value;
}
}
}
class Program {
static void Main(string[] args) {
TestClass1 t1 = new TestClass1();
t1.Point.X = 10;
Console.WriteLine(t1.Point.X);
TestClass2 t2 = new TestClass2();
t2.Point.X = 10; // コンパイルエラー
Console.WriteLine(t2.Point.X);
}
}
型が構造体の値をフィールドで公開するのか、プロパティで公開するのかでは、その挙動は大きく異なる。後からプロパティにしたらいいじゃん、というレベルではないので気をつけよう。
そもそも、クラスのメンバとして公開されている構造体の、更にそのメンバに直接値を設定してはいけない。その構造体がフィールドとして公開されていれば設定できるが、プロパティとして公開されていれば設定できない。
プロパティが実はメソッドであるという事を考えれば至極当然なのだが、構文上はメソッドに見えないので気を付けなければならない。
プロパティの場合、このコードを書いたら C# ではコンパイルエラーにしてくれる。VB では実行時例外だ。ただし、Visual Studio を使っていれば、VB の場合、インテリセンスに候補が出ない。
先に型が構造体の値をフィールドとして公開しておいて、誰かが上記のような使い方をしていたとしたら、後からプロパティに変更するのは困難を極めるだろう。だから、型が構造体の値は必ずプロパティとして公開した方が良い。
#プリミティブ型を除く(変更できないから)。