tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 の値しか代入させない」
といった機能を組み込むことができますが、フィールド変数ではそれができませんね。

使い方が同じだから、どちらでも同じ機能であるかのように見えてしまいますが、
後から実装方法を変えるのは、互換性が失われるので避けた方が良いかも知れません。
たとえば、データバインドなどのように、リフレクションによる実装が行われて
いる場合には、クラス側にはフィールド変数ではなく、プロパティとしての実装が
求められる事もあったりします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。