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

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

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

Re[6]: クラス間で大量のパラメタをやりとりする


(過去ログ 93 を表示中)

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

■55366 / inTopicNo.1)  クラス間で大量のパラメタをやりとりする
  
□投稿者/ jun (3回)-(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

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

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

MSDNより:
http://msdn.microsoft.com/ja-jp/library/2hkbth2a(VS.80).aspx

引用返信 編集キー/
■55377 / inTopicNo.3)  Re[2]: クラス間で大量のパラメタをやりとりする
□投稿者/ jun (4回)-(2010/11/28(Sun) 23:51:48)
shu さん

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

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


★解決済みとしても良いのですが、他の方のご意見もお聞きしたいと思いますので、
 もう少しこのままとさせてください。

引用返信 編集キー/
■55378 / inTopicNo.4)  Re[3]: クラス間で大量のパラメタをやりとりする
□投稿者/ Azulean (656回)-(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) から参照するときにコピーされます。
この挙動からまったく問題がないとは言えないと思っています。(程度の差はありますが)

ちなみに、配列の場合は別の挙動をします。
引用返信 編集キー/
■55379 / inTopicNo.5)  Re[4]: クラス間で大量のパラメタをやりとりする
□投稿者/ shu (211回)-(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さんの提示した内容ではデータ量が多くなければ大丈夫かなとは思います。


引用返信 編集キー/
■55414 / inTopicNo.6)  Re[5]: クラス間で大量のパラメタをやりとりする
□投稿者/ jun (5回)-(2010/11/30(Tue) 00:50:28)
shu さん
Azulean さん

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

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

#このへんで解決済みとさせていただきます
解決済み
引用返信 編集キー/
■55421 / inTopicNo.7)  Re[6]: クラス間で大量のパラメタをやりとりする
□投稿者/ なちゃ (481回)-(2010/12/01(Wed) 12:36:12)
明確に理由がない限りはクラスの方が無難だと思いますよ。
すでに出てますが、構造体は結構落とし穴やらがあります。
ちゃんと分かってる人ばかりならまあ良いんですけどね。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -