タイトル : Re: プロパティの定義方法で疑問 投稿日 : 2008/06/29(Sun) 21:57 投稿者 : 魔界の仮面弁士
> 2つのプロパティ(OpenProp、CloseProp)を定義した場合、 CloseProp の方はプロパティですが、 OpenProp はプロパティではなく、フィールド変数です。 > Testobj.OpenProp=1 '←この文はエラー「宣言が必要です。」 > Testobj.CloseProp=2 '←この文はエラー「宣言が必要です。」 クラスの直下に、このような処理を書くことはできません。 Sub / Function などのプロシージャ内部で行うようにしてください。 > Dim i As Integer = Testobj.OpenProp '文法エラーにはならない > Dim j As Integer = Testobj.CloseProp '文法エラーにはならない これらは、フィールド変数の初期値を設定しているだけなので、 その前の 2 行とは意味合いが異なります。 ただ、初期化の順番を保証するためにも、Testobj のプロパティを呼び出すなら、 Test クラス側にコンストラクタを設けて、その中で初期化処理を行うべきかと。 > 質問1:なんでコンパイルエラーになるのでしょうか? クラスの直下におけるのは「宣言」だけだからです。 (Dim ステートメントは、フィールド変数の宣言として扱われます) > 質問2:プロパティを使う側としては、OpenPropもClosePropも使い勝手は同じなのに > なぜ2通りの書き方ができるのでしょうか?どんな違いがあるのでしょうか? Private な場合は、どちらでも構いません。 プロパティでは冗長的な場合には、フィールド変数にしておけば十分かと思います。 Public な場合は、常にプロパティを使用すべきです。 フィールド変数を Public にするのは、ReadOnly な場合だけにしておきましょう。 で、違いとしては…プロパティとして実装されていれば、 「Text プロパティが変更されたら、TextChanged イベントを発生させる」 「Month プロパティには、1〜12 の値しか代入させない」 といった機能を組み込むことができますが、フィールド変数ではそれができませんね。 使い方が同じだから、どちらでも同じ機能であるかのように見えてしまいますが、 後から実装方法を変えるのは、互換性が失われるので避けた方が良いかも知れません。 たとえば、データバインドなどのように、リフレクションによる実装が行われて いる場合には、クラス側にはフィールド変数ではなく、プロパティとしての実装が 求められる事もあったりします。 |