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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.55366 の関連記事表示

<< 0 >>
■55366  クラス間で大量のパラメタをやりとりする
□投稿者/ jun -(2010/11/28(Sun) 15:09:55)

    分類:[VB.NET/VB2005 以降] 

    VB2010

    お世話になります。
    VBというか、オブジェクト指向そのものが理解できておらず、
    周りにも有識者がいなく、作りとして良いか悪いか判断できないため、
    投稿させていただきました。

    現在、画面で設定された値をもとに、複数の定義体を作成するツールを作成しており、
    画面で設定されたパラメタをどのように他クラスへ渡すのが良いのか悩んでおります。

    以下のソースでは、画面の値をすべて GamenParam に格納して、それを他クラスへ
    渡す際、コンストラクター渡ししており、この部分で悩んでおります。
    また、GamenParam内で、構造体を使用していますが、構造体は値型であるため、
    大量のデータを受け渡す場合には向いていないような感じもしています。
    このような場合、皆様はどのようにされているのでしょうか?
    ご意見を頂けたらと思います。

    よろしくお願いします。

    Public Class Form1
    Private Sub Button1_Click(・・・
    Dim param As New GamenParam
    '★ここで画面の入力値を param に格納
    Dim c1 As New Class1(param)
    c1.Class1_Run()
    Dim c2 As New Class2(param)
    c2.Class2_Run()
    End Sub
    End Class

    Public Class Class1
    Private _param As GamenParam
    Public Sub New(ByVal p As GamenParam)
    _param = p
    End Sub
    Public Sub Class1_Run()
    Console.WriteLine(_param.kojin(0).name & " : " & _param.kojin(0).addr)
    End Sub
    End Class

    Public Class Class2
    Private _param As GamenParam
    Public Sub New(ByVal p As GamenParam)
    _param = p
    End Sub
    Public Sub Class2_Run()
    Console.WriteLine(_param.kojin(1).name & " : " & _param.kojin(1).age)
    End Sub
    End Class

    Public Class GamenParam
    Public outPath As String
    Public kojin As Generic.List(Of stKojin)
    End Class

    Public Structure stKojin
    Public name As String
    Public addr As String
    Public age As Integer
    End Structure
親記事 /過去ログ93より / 関連記事表示
削除チェック/

■55372  Re[1]: クラス間で大量のパラメタをやりとりする
□投稿者/ shu -(2010/11/28(Sun) 21:12:47)
    No55366 (jun さん) に返信

    > 構造体は値型であるため、
    > 大量のデータを受け渡す場合には向いていないような感じもしています
    構造体でもクラスでも確保されるメモリに大差はありません。構造体をそのまま
    渡す場合はコピーが作成されるので気をつけなければいけませんが今回の場合
    list(of 〜)によってわたされるので問題はないかと思います。構造体は値型であることを
    気を付けて使用すれば簡単な構造の型ではパフォーマンスがよくなります。

    MSDNより:
    http://msdn.microsoft.com/ja-jp/library/2hkbth2a(VS.80).aspx
記事No.55366 のレス /過去ログ93より / 関連記事表示
削除チェック/

■55377  Re[2]: クラス間で大量のパラメタをやりとりする
□投稿者/ jun -(2010/11/28(Sun) 23:51:48)
    shu さん

    返信ありがとうございます。

    > MSDNより:
    > http://msdn.microsoft.com/ja-jp/library/2hkbth2a(VS.80).aspx
    投稿前にここを読んでいたのですが、あまり理解できずにモヤッとしてました。
    やはりここが重要な箇所なのですね。
    何度も読み直して勉強したいと思います。


    ★解決済みとしても良いのですが、他の方のご意見もお聞きしたいと思いますので、
     もう少しこのままとさせてください。
記事No.55366 のレス /過去ログ93より / 関連記事表示
削除チェック/

■55378  Re[3]: クラス間で大量のパラメタをやりとりする
□投稿者/ Azulean -(2010/11/29(Mon) 07:16:31)
    こういうガイドラインも公開されています。
    http://msdn.microsoft.com/ja-jp/library/ms229017.aspx

    No55372 (shu さん) に返信
    > 構造体をそのまま渡す場合はコピーが作成されるので気をつけなければいけませんが
    > 今回の場合list(of 〜)によってわたされるので問題はないかと思います。

    List(Of T) に追加するとき、List(Of T) から参照するときにコピーされます。
    この挙動からまったく問題がないとは言えないと思っています。(程度の差はありますが)

    ちなみに、配列の場合は別の挙動をします。
記事No.55366 のレス /過去ログ93より / 関連記事表示
削除チェック/

■55379  Re[4]: クラス間で大量のパラメタをやりとりする
□投稿者/ shu -(2010/11/29(Mon) 08:13:13)
    2010/11/29(Mon) 09:08:06 編集(投稿者)

    No55378 (Azulean さん) に返信
    >
    > List(Of T) に追加するとき、List(Of T) から参照するときにコピーされます。
    > この挙動からまったく問題がないとは言えないと思っています。(程度の差はありますが)
    確かにそこは気を付けるべきとこですね。失礼しましたmm

    そして私が1つ勘違いしていたとこがありましたので、出来ない例を載せておきます。

    Dim lst As New List(Of stKojin)

    lst.Add(New stKojin() With {.name = "a", .addr = "addr1", .age = 10})
    lst.Add(New stKojin() With {.name = "b", .addr = "addr2", .age = 12})
    lst.Add(New stKojin() With {.name = "c", .addr = "addr3", .age = 30})

    lst(1).name = "b1" '<--- これは出来ない

    Dim ary = new stKojin() { _
    New stKojin() With {.name = "a", .addr = "addr1", .age = 10}, _
    New stKojin() With {.name = "b", .addr = "addr2", .age = 12}, _
    New stKojin() With {.name = "c", .addr = "addr3", .age = 30}}

    ary(1).name = "b1" '<--- これは出来る

    ということで、listを使用する場合構造体のコピーをしないと書換えが出来ないので
    書換えが発生し構造体が大きくなる場合はclassにした方が良さそうです。
    junさんの提示した内容ではデータ量が多くなければ大丈夫かなとは思います。

記事No.55366 のレス /過去ログ93より / 関連記事表示
削除チェック/

■55414  Re[5]: クラス間で大量のパラメタをやりとりする
□投稿者/ jun -(2010/11/30(Tue) 00:50:28)
    shu さん
    Azulean さん

    有益な情報ありがとうございました。

    クラスと構造体、参照型と値型etc、いろいろ先は長そうですが、
    コツコツ勉強していき、ちゃんと使い分けられるようになろうと思います。

    #このへんで解決済みとさせていただきます
記事No.55366 のレス / END /過去ログ93より / 関連記事表示
削除チェック/

■55421  Re[6]: クラス間で大量のパラメタをやりとりする
□投稿者/ なちゃ -(2010/12/01(Wed) 12:36:12)
    明確に理由がない限りはクラスの方が無難だと思いますよ。
    すでに出てますが、構造体は結構落とし穴やらがあります。
    ちゃんと分かってる人ばかりならまあ良いんですけどね。
記事No.55366 のレス /過去ログ93より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -