クラスのプロパティについて

タグの編集
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/2 01:36:47
皆さんは、クラスの単純なプロパティの宣言の場合、下のプロパティを使う方法とPUBLICな変数とどちらを使いますか?
サンプル1
Public Class A
    Dim _val As String

    Public Property PropertyTest() As String
        Get
            Return _val
        End Get
        Set(ByVal value As String)
            _val = value
        End Set
    End Property
End Class


サンプル2
Public Class b
    Public PropertyTest As String
End Class


自分は、変数を直接外部にさらすのはいやなのでサンプル1を使っていたのですが、プロパティが多いと面倒だしプロパティ内で単純に変数に入れなおすだけのものなら、サンプル2でもいいのかなと思います。
みなさんは、どちらを使われていますか。
(すみません、お返事はGW明けになってしまうと思います。)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/5/2 02:01:26
VB2010だと、このようにも書けたりします。
Public Class C
    Public Property PropertyTest As String  
End Class



> みなさんは、どちらを使われていますか。
Private あるいは Friend な場合には、フィールド変数で済ませることもありますが、
Public あるいは Protected の場合には、プロパティで実装するようにしています。



プロパティ実装とフィールド変数実装の動作の違いについて。

Private Items1 As List(Of A)
Private Items2 As List(Of b)
Private Sub Form1_Load(ByVal sender As ObjectByVal e As EventArgs) Handles MyBase.Load
    Items1 = New List(Of A)()
    Items2 = New List(Of b)()
    For n As Integer = 1 To 10
        Dim x As New A()
        Dim y As New b()
        Items1.Add(x)
        Items2.Add(y)
        x.PropertyTest = String.Format("TEST{0,-3}", n)
        y.PropertyTest = String.Format("TEST{0,-3}", n)
    Next
    ComboBox1.DataSource = Items1
    ComboBox2.DataSource = Items2
    ComboBox1.DisplayMember = "PropertyTest"
    ComboBox2.DisplayMember = "PropertyTest"
End Sub
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/2 03:39:27
魔界の仮面弁士さん、ありがとうございます。

>VB2010だと、このようにも書けたりします。
VB2010いいですね。早く使ってみたいです。
といっても、会社で買ってもらえるかどうか・・・
(いまだにExpressEditionで開発してる状態だし)


>プロパティ実装とフィールド変数実装の動作の違いについて。
使い捨て関数ならともかく、DisplayMemberに指定できないのは問題ですね。


ちなみに、ヘルプにDisplayMemberにプロパティ以外の挙動について書かれているのに気づかず
30分ぐらい悩んだのは秘密です。
投稿者 まだまだ  (中学生) 投稿日時 2009/5/2 05:48:46
へえ~、もうVB2010って手に入るんですか。
僕も見てみたいな。
できればどこで手に入れられるか教えていただけませんか?

なんか答えるどころか質問してすみません。
投稿者 brv  (中学生) 投稿日時 2009/5/3 00:22:13
>VB2010だと、このようにも書けたりします。
VB2010だとそんな書き方ができるんですね!知りませんでした。
プロパティを宣言するのに何行も使っていたところが一行になって、すっきりしたコードを書けるようになるかもしれません。

オブジェクト指向では、内部の変数などを直接外に出すのではなく、プロパティなどを通じて外に出すのが普通…らしいです。
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/7 19:01:13
まだまださん
>できればどこで手に入れられるか教えていただけませんか?
>なんか答えるどころか質問してすみません。

自分もその後検索したのですが、結構の記事がhitしました。
気になった点をフィードバックして見ます。見たいな事が書かれていたから、TechNet会員向けにα版が配布されたのかなと思っています。


brvさん
>オブジェクト指向では、内部の変数などを直接外に出すのではなく、プロパティなどを通じて外に出すのが普通…らしいです。

自分も今まではプロパティを使っていたのですが、データベースのテーブルのイメージをクラスに置き換えようとすると(そもそもこれが間違いなのかな?)かなりの量の単純なプロパティを書かなければならないため、少しでも楽にならないかなと思い投稿させてもらいました。



また、VB2010の自動実装プロパティはC#での2008で実装済みのようですね。
新機能は、C#に先に実装されるようですね。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/5/7 21:54:45
> できればどこで手に入れられるか教えていただけませんか?

Visual Studio 2010 はまだ発売前の製品なので、現時点においては、
技術的な事前評価版(Community Technology Preview)が存在するのみです。
そのため、一部の機能が実装されていなかったり、今後、仕様が変更される事もあります。

現在、Limited CTP の一般公募は行われていませんが、
より古いバージョンの CTP が、下記から入手可能です。
http://go.microsoft.com/fwlink/?LinkID=132855


> 自分もその後検索したのですが、結構の記事がhitしました。
上記の URL は、過去に何度か紹介していますので、このサイトの検索機能で、
 ・すべての話題
 ・キーワード「2010」
 ・検索対象:本文
などとして、過去ログから探してみてください。
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=9086
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=9020
http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=146


> 新機能は、C#に先に実装されるようですね。 
そうとも限りません。たとえば、2010 版の C# (C# 4.0) の新機能として挙げられている、
 (1)動的型付け
 (2)オプション引数
 (3)名前付き引数
などについては、Visual Basic の方が先です。
なにしろ、VB.NET どころか、.NET 化する以前から実装されていたのですから。

(1) は、Option Strict Off モードにおける、Object 型経由のプロパティ/メソッド呼び出しです。
(2) は、引数指定の Optional パラメータに相当。
(3) は、VB では「:=」というキーワードで指定できますね。
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/8 01:50:43
魔界の仮面弁士さん
>> 新機能は、C#に先に実装されるようですね。 
>そうとも限りません。たとえば、2010 版の C# (C# 4.0) の新機能として挙げられている、
> (1)動的型付け
> (2)オプション引数
> (3)名前付き引数
>などについては、Visual Basic の方が先です。

ありゃ、とうとうこれたの機能がC#で実装されるのですか。
この辺は、VBとC#を比較するときに、よく話題にでますよね。


両言語ともあまりディープな使い方をしてないので、違いがわかっていないだけかも知れませんが、MyがC#
で正式実装されると、あまり違いがなくなるような・・・
(今でも使おうと思えば使えますし・・・)
将来的には、この両言語統合されたりして(^^;
(プロパティでVB風・C#風と間単に切り替わることができるとか)
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/8 01:54:01
そういえば、タイトルと話の内容がぜんぜん違う方向に行ってしまってますね。
話題も、「技術」になっていますし(^^;

この後もスレが伸びるようなら、いったん、このスレ閉じて、雑談-「VB2010について」としたほうがいいかな?
投稿者 neptune  (社会人) 投稿日時 2009/5/8 08:05:02
ちょっとだけお邪魔します。

「クラスのプロパティについて」に関係ありそうで、ないかもしれません。

>Public Class C
>    Public Property PropertyTest As String  
>End Class
の話ですが、ちょうど今、SHBrowseForFolderをC#で作りこもうと
がんばっている最中なんで、使おうと思いましたけど、

たとえば、何か処理してからメンバ変数に保管する場合
        public int hoge
        {
            //何かの確認処理
              ・・・・・
              //保管
            set{m_hoge = value;}
        }

とか、何かの処理をはさむ場合困りますよね。使い分ければ問題ないですが、
私ならメンバ変数をm_hogeとして見分けをつけてますけど、フィールド変数実装
と、プロパティ変数(メンバ変数)実装が混ざり合うと変なバグを抱えてしまいそうで
やめました。・・・公開するフィールド変数ならプリフィクスが付けにくい

なので、Class毎、目的毎に使い分けたら便利ではありそうです。

ちなみに私は、サンプル1派です。
面倒だけど判りやすい。改造しやすい。?
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/8 19:56:48
neptuneさん、ありがとうございます。

>何かの処理をはさむ場合困りますよね。
確かに間に何か処理を挟む場合は、必然的にプロパティですね。
ただ、自分の場合ほぼ100%で単純な格納だけなので、特にめんどくさいと感じてしまったのかも知れません。(やっぱり、クラスをうまく使えていないのかな)


>フィールド変数実装と、プロパティ変数(メンバ変数)実装が混ざり合うと変なバグを抱えてしまいそうでやめました。
フィールド変数実装の場合は、命名規則をプロパティの命名規則にしたがって付けると、多少はいいかも知れませんね。後々、プロパティ実装にしたときに修正も少なくすみますし、クラスを使う側は実装方法なんか気にしないですからね。


皆さんの貴重なご意見をいただけて、大変うれしく思います。


これを書いていて、VS2010にこういう機能がほしいなと思いついたことがあったので、別スレを立てようと思います。もし、よかったらそちらでもご意見をいただければと思います。