DOBON.NET DOBON.NETプログラミング掲示板過去ログ

public変数とpropertyの使い分け

環境/言語:[WindowsXP/VB.NET]
分類:[.NET]

2006/01/10(Tue) 23:29:23 編集(投稿者)

すみません。コードにミスを見つけて編集いたしました。
---

はじめまして。Nontaと申します。よろしくお願いいたします。

変数を、
 publicで定義した場合と、
 privateで定義してpropertyでアクセスした場合とで、
何が違うのか、どう使い分けるのかがわからず困っています。
具体的には、以下のようにクラス A を定義したときに、
どちらも外部から A.a としてアクセスできると思います。
Web上のサンプルなどでは後者のpropertyを使った方法で
書かれることが多いように思いますが、なにかメリットが
あるのでしょうか。


Public Class A
  Public a As String
End Class


Public Class A
  Private _a As String

  Public Property a() As String
    Get
      Return Me._a
    End Get
    Set(ByVal Value As String)
      Me._a = Value
    End Set
  End Property
End Class


どなたかお教え頂きたくお願い申し上げます。
> 変数を、
> publicで定義した場合と、
> privateで定義してpropertyでアクセスした場合とで、
> 何が違うのか、どう使い分けるのかがわからず困っています。

・setter で設定値の範囲チェックをすることができる。
・getter しか公開しなければ「読み取り専用のフィールド」が手軽に作れる。
・getter で「その瞬間のオブジェクトの状態」を反映した値を返すことが出来る。

などなど。。。
ありがとうございました。
言われてみれば、当たり前でした。^^;

かゆいところまで手が届くという点でpropertyのほうが断然良いですね…。

特に
> ・setter で設定値の範囲チェックをすることができる。
これは嬉しいなと思いました。
解決済み!
■No14432に返信(Nontaさんの記事)
> 特に
> > ・setter で設定値の範囲チェックをすることができる。
> これは嬉しいなと思いました。

値を補正するような "おせっかい" をするかどうかは仕様次第でしょうけど、
これは例外をスローすべき場合が殆どであることに注意してください。

> > ・getter しか公開しなければ「読み取り専用のフィールド」が手軽に作れる。

副作用的な側面がない場合 (かつ静的な場合) は、ReadOnly なフィールドの方が明確な場合もあります。
例を挙げると、String.Empty などですね。

> > ・getter で「その瞬間のオブジェクトの状態」を反映した値を返すことが出来る。

コントロールなどですと、メインとなる部分ですね。

あとは概念的な要素がありますよね。
クラスのメソッドの動作が変わるなどの側面があれば、概念的にプロパティを使った方が "明示化" できます。
解決済み!
いろいろありがとうございます。恐れ入ります。

> あとは概念的な要素がありますよね。
> クラスのメソッドの動作が変わるなどの側面があれば、概念的にプロパティを使った方が "明示化" できます。

少しこの点が理解しきれなかったのですが(なんとなくはわかるのですが)、
「何を」明示化できるのでしょうか?
もしよろしければ簡単な具体例など挙げていただければ有難いのですが。
■No14443に返信(Nontaさんの記事)
> > クラスのメソッドの動作が変わるなどの側面があれば、概念的にプロパティを使った方が "明示化" できます。
> 少しこの点が理解しきれなかったのですが(なんとなくはわかるのですが)、
> 「何を」明示化できるのでしょうか?

「クラスのメソッドの動作が変わるなどの側面」があることなどです。
動作そのものはメソッドが概念的に正しいですよね。

> もしよろしければ簡単な具体例など挙げていただければ有難いのですが。

「ファイルを開く」ダイアログなどを ShowDialog する前に設定する各種プロパティなどをイメージしてください。

_________________________________________________________________________
じゃんぬ Microsoft MVP for Visual Developer - C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
> 「ファイルを開く」ダイアログなどを ShowDialog する前に設定する各種プロパティなどをイメージしてください。

わかりました。ありがとうございます。
最初に書いたサンプルで言えば、プロパティは、単純に A.a の値が "あ" から "い" に変わるだけでなく、その値が変わることでオブジェクトの状態が変わるということを表現するわけですね。

個人的な、直感的な理解としては、プロパティとは「変数に値を設定/取得するときに起きるイベント」という感じなのかなと思いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板