C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: VBのGet,Setを持つpropertyの意義


(過去ログ 23 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■10011 / inTopicNo.1)  VBのGet,Setを持つpropertyの意義
  
□投稿者/ エニグマ (1回)-(2007/11/09(Fri) 11:01:04)

分類:[VB.NET/VB2005] 

Visual Basic 2005 Express Edition の学習をしています。

visual basicのクラスの定義において

Public Class TestClass
    Private numVal As Integer

    Public Property num() As Integer
        Get
            num = numVal
        End Get
        Set(ByVal value As Integer)
            numVal = value
        End Set
    End Property
End Class

のように記述することで
numプロパティを通じてnumValの値を参照できます。

つまり

Dim num2 As Integer
Dim tc As New TestClass
tc.num = 10
num2 = tc.num

のようなことが出来るわけです。

これは、TestClassにpublicなnum変数を用意するのと何が違うのでしょうか?

もちろん、プロパティを用いずにGetNum,SetNumという関数を作っても同じことなのですが
この方がまだ、関数の使用意図(GetなのかSetなのか)がはっきりして良いのではないかと思います。

つまり、同じ名前でGetもSetもできるプロパティは変数と同じではないのかという疑問です。
よろしくお願いします。

引用返信 編集キー/
■10012 / inTopicNo.2)  Re[1]: VBのGet,Setを持つpropertyの意義
□投稿者/ επιστημη (638回)-(2007/11/09(Fri) 11:15:33)
επιστημη さんの Web サイト
> これは、TestClassにpublicなnum変数を用意するのと何が違うのでしょうか?

publicなnum変数を用意するのと同じ動きをさせているので何も違いはありません。

> つまり、同じ名前でGetもSetもできるプロパティは変数と同じではないのかという疑問です。

get/set内で単に読み出し/書き込みしている"だけ"なら同じです。

引用返信 編集キー/
■10013 / inTopicNo.3)  Re[2]: VBのGet,Setを持つpropertyの意義
□投稿者/ まどか (399回)-(2007/11/09(Fri) 11:39:29)
#ある意味旬な話題でもありますが

Property プロシージャですから、実装を記述できます。
たとえば、Setで〜Changedを発生させたり。

リフレクションとかではフィールドとプロパティは区別されますので、「プロパティでなければならない」という制約が出てきたりって事もあります。
#使い分けの基準ではありませんが

関数との違いは、関数は処理ですのでその結果の副作用として値が変わることがあるというところでしょうか。
値ではなく目的ですから。
引用返信 編集キー/
■10017 / inTopicNo.4)  Re[3]: VBのGet,Setを持つpropertyの意義
□投稿者/ じゃんぬねっと (535回)-(2007/11/09(Fri) 12:22:48)
@IT 会議室でも同じ話題がありましたね。
最終的な結論としては 「副次的な作用の保証」 と 「値の検証」 と 「デザイナ」 と 「概念的な意味合い」 です。

副次的な作用とは、イベントを起こしたり、バインド処理を行ったり、実際の色を変える処理を呼んだりすることです。
BackColor プロパティを例に出すと、プロパティの値が変わった段階でホントに背景色も変わるわけです。
これをただの変数で表現することはできません。

値の検証とは仕様外の値をセットしようとした時に検証の余地があるということです。
例外を放り投げるのが基本です。
これもただの変数で表現することはできません。

あとは IDE 的な仕様に付随しますが、デザイナがプロパティ ウィンドウを持っているというのも理由のひとつです。

古い VB では ReadOnly にできるという利点もあったのですが、今の VB にはフィールドにも ReadOnly が付けられますから除外ですね。
引用返信 編集キー/
■10021 / inTopicNo.5)  Re[4]: VBのGet,Setを持つpropertyの意義
□投稿者/ よねKEN (83回)-(2007/11/09(Fri) 15:17:50)
> 古い VB では ReadOnly にできるという利点もあったのですが、
> 今の VB にはフィールドにも ReadOnly が付けられますから除外ですね。

プロパティのReadOnlyとフィールドのReadOnlyは異なるので、
これも一つの利点になると思います。
プロパティの場合は、外部からはReadOnlyですが、内部からは書き換え可能ですよね。



引用返信 編集キー/
■10022 / inTopicNo.6)  Re[5]: VBのGet,Setを持つpropertyの意義
□投稿者/ れい (174回)-(2007/11/09(Fri) 16:05:39)
No10021 (よねKEN さん) に返信
>>古い VB では ReadOnly にできるという利点もあったのですが、
>>今の VB にはフィールドにも ReadOnly が付けられますから除外ですね。
>
> プロパティのReadOnlyとフィールドのReadOnlyは異なるので、
> これも一つの利点になると思います。
> プロパティの場合は、外部からはReadOnlyですが、内部からは書き換え可能ですよね。


Setがなければ内部からも書き換えできませんよ。

ところで。

>最終的な結論としては 「副次的な作用の保証」 と 「値の検証」 と 「デザイナ」 と 「概念的な意味合い」 です。
ListBoxとかに流し込むとき、DisplayMemberに設定するのはフィールドじゃダメだった気がします。

そーゆー感じで、内部でリフレクションを使っているときには
プロパティだけOKっていうのが結構あったように思えます。

引用返信 編集キー/
■10024 / inTopicNo.7)  Re[5]: VBのGet,Setを持つpropertyの意義
□投稿者/ じゃんぬねっと (536回)-(2007/11/09(Fri) 16:12:52)
No10021 (よねKEN さん) に返信
> プロパティのReadOnlyとフィールドのReadOnlyは異なるので、
> これも一つの利点になると思います。
> プロパティの場合は、外部からはReadOnlyですが、内部からは書き換え可能ですよね。

あー、そうですね。

フィールドの ReadOnly はコンストラクタまで値を変更でき以後は値の変更が一切不可能。
プロパティの ReadOnly は "そのプロパティ プロシージャ" という条件付きの読み取り専用。

内部から値が変更できるのは、実体のプロパティ変数はただのフィールドという理由からですが、
フィールドはそれ自身が生の値なのでコンストラクタが終わってからは内部からですら変更不可であり、
アクセス修飾子レベルでの ReadOnly という概念は存在しないでしたね。
引用返信 編集キー/
■10025 / inTopicNo.8)  Re[6]: VBのGet,Setを持つpropertyの意義
□投稿者/ じゃんぬねっと (537回)-(2007/11/09(Fri) 16:14:52)
No10022 (れい さん) に返信
> ListBoxとかに流し込むとき、DisplayMemberに設定するのはフィールドじゃダメだった気がします。
>
> そーゆー感じで、内部でリフレクションを使っているときには
> プロパティだけOKっていうのが結構あったように思えます。

あ、重要なのを忘れていました。(^^;
それもどっかのスレで取り上げられていましたね。
引用返信 編集キー/
■10026 / inTopicNo.9)  Re[6]: VBのGet,Setを持つpropertyの意義
□投稿者/ よねKEN (84回)-(2007/11/09(Fri) 16:55:01)
>>プロパティのReadOnlyとフィールドのReadOnlyは異なるので、
>>これも一つの利点になると思います。
>>プロパティの場合は、外部からはReadOnlyですが、内部からは書き換え可能ですよね。
>
> ?
> Setがなければ内部からも書き換えできませんよ。

じゃんぬねっとさんにフォロー頂いている通りです。
外部からはプロパティ経由でしかフィールドにアクセスできないからReadOnlyですが、
内部からは直接フィールドを変更できるので書き換えることが可能、という意味です。
引用返信 編集キー/
■10027 / inTopicNo.10)  Re[7]: VBのGet,Setを持つpropertyの意義
□投稿者/ れい (175回)-(2007/11/09(Fri) 17:04:30)
No10026 (よねKEN さん) に返信
> >>プロパティのReadOnlyとフィールドのReadOnlyは異なるので、
> >>これも一つの利点になると思います。
> >>プロパティの場合は、外部からはReadOnlyですが、内部からは書き換え可能ですよね。
>>
>>?
>>Setがなければ内部からも書き換えできませんよ。
>
> じゃんぬねっとさんにフォロー頂いている通りです。
> 外部からはプロパティ経由でしかフィールドにアクセスできないからReadOnlyですが、
> 内部からは直接フィールドを変更できるので書き換えることが可能、という意味です。

まぁわかるんですが。

でもそれは対応するフィールドを書き換えてるのであって
プロパティを書き換えてるわけではないですよね。

対応するフィールドを持たないプロパティもあるわけですし。
引用返信 編集キー/
■10028 / inTopicNo.11)  Re[8]: VBのGet,Setを持つpropertyの意義
□投稿者/ じゃんぬねっと (538回)-(2007/11/09(Fri) 17:11:23)
おそらくよね KEN さんは、フィールドとの対比という意味で書かれているのでしょう。
私がいけなかったわけですが (コトの発端は私) 最初の引き合いで書いてしまっていますから...
引用返信 編集キー/
■10031 / inTopicNo.12)  Re[9]: VBのGet,Setを持つpropertyの意義
□投稿者/ れい (176回)-(2007/11/09(Fri) 18:17:52)
No10028 (じゃんぬねっと さん) に返信
> おそらくよね KEN さんは、フィールドとの対比という意味で書かれているのでしょう。
> 私がいけなかったわけですが (コトの発端は私) 最初の引き合いで書いてしまっていますから...

いいえ。別にじゃんぬさんがいけないわけではないです。

よねKENさんもじゃんぬさんもその辺は全部わかっているということを、
私は知っていますし、
私がわかっているということも理解してくれてると思います。

この件は、フィールドとプロパティの違いが分からないということですから、
フィールドに対する読み込み・書き込み、
プロパティに対する読み込み・書き込み、
その辺を省略せずに明確に・厳密に書かなければ、
質問者・閲覧者が混乱する可能性があるかと思っただけです。
引用返信 編集キー/
■10037 / inTopicNo.13)  Re[10]: VBのGet,Setを持つpropertyの意義
□投稿者/ エニグマ (2回)-(2007/11/09(Fri) 21:08:32)
たくさんの回答ありがとうございます。

フィールドへの直接アクセスでなく、プロパティを経由する理由は
エラーチェックなど、何らかの処理を経由できるから、ということですね。

ただ

    Public Function GetNum() As Integer
        Return numVal
    End Function

ではなく

    Public ReadOnly Property num() As Integer
        Get
            Return numVal
        End Get
    End Property

とする理由がいまいちよくわかりません。
回答では、プロパティしか受け付けない処理(内部でリフレクション?)があるから、とありますが
そういう処理にメソッドの返り値を渡すことはできないのでしょうか?

よろしくお願いします。

引用返信 編集キー/
■10040 / inTopicNo.14)  Re[11]: VBのGet,Setを持つpropertyの意義
□投稿者/ れい (179回)-(2007/11/09(Fri) 23:42:31)
No10037 (エニグマ さん) に返信
> とする理由がいまいちよくわかりません。

理由はいろいろです

デザイン上のものと他との兼ね合いと、その2者が大きな決定理由になります。

基本的に、
プロパティはオブジェクトの状態を示すものであり、
値をGetしたときオブジェクトの状態が変わらないよう作ります。
また、Getしたオブジェクトは取得元のオブジェクトと関連付けされてる場合があります。
(ListBox.Itemsなど。)

メソッドはそうとは限りません。
GetXXXというメソッドの返り血は
取得元のオブジェクトと関連付けされていないオブジェクトの場合が殆どです。

あと、リフレクション等で使われる場合で、
他からプロパティであることを要請される場合はもちろんプロパティになります。

> 回答では、プロパティしか受け付けない処理(内部でリフレクション?)があるから、とありますが
> そういう処理にメソッドの返り値を渡すことはできないのでしょうか?

例えば。

ListBoxのDataSourceにコレクションや配列を指定した場合、
コレクションの要素のプロパティ名をDisplayMemberに指定すると
そのプロパティを使ってくれます。

メソッドの返り血を表示したい場合、
いくつかインターフェースを実装したりしないといけないので、
めんどくさいです。
引用返信 編集キー/
■10041 / inTopicNo.15)  Re[12]: VBのGet,Setを持つpropertyの意義
□投稿者/ エニグマ (3回)-(2007/11/10(Sat) 00:27:33)
C++ではずっとメンバ関数で処理していたので、VBの学習の際に疑問に思っていましたが
プロパティを使用するメリットを理解できました。

解決しました、解答ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -