none
構造体を常に決まった内容で初期化する場合について RRS feed

  • 質問

  • OS:WinXP Pro SP3
    言語:VS2010ProのVB

    構造体を常に決まった内容で初期化しようとして、
    例えば以下のように書いた場合・・・

    Public Structure StrctTest
      Public Data1 As Integer
      Public Data2 As Integer
      Public Data3 As String
      Public Data4 As String
      Public Sub New()
        Data1 = 1
        Data2 = 2
        Data3 = "ABC"
        Data4 = "DEF"
      End Sub
    End Structure


    「構造体で、共有されていない、パラメーターなしの 'Sub New' を宣言することはできません。」
    というエラーになりました。
    構造体の初期化についてググったところ、見つかったサンプルではSub Newの引数に
    初期化するメンバーへの値をすべて書いているのですが、常に同じ内容なので、
    出来ることならいちいち書きたくありません。
    そこでPublic Sub New(ByVal Dummy As Integer)として

    構造体を使う際は、
    Dim StData As New StrctTest(0)
    とすれば初期化できてはいるのですが・・・
    これでいいのでしょうか?
    もっと他に良い方法をご存知の方がおられましたら
    ご教授願いたくよろしくお願いします。
    2011年2月18日 9:05

回答

  • 構造体とクラスの違いを理解した上で、構造体を選択されているのでしょうか?

    見た感じ、クラスで十分なような印象ですが。

    • 回答としてマーク tarosuke_vs 2011年2月21日 4:20
    2011年2月18日 10:13

すべての返信

  • 構造体とクラスの違いを理解した上で、構造体を選択されているのでしょうか?

    見た感じ、クラスで十分なような印象ですが。

    • 回答としてマーク tarosuke_vs 2011年2月21日 4:20
    2011年2月18日 10:13
  • 左祐理さんのおっしゃっている通り、値型・参照型、スタック・ヒープなど意識していなければ

    クラスで書くほうがわかりやすいですね。

    2011年2月18日 10:57
  • 値型(structure)が引数なしのコンストラクタを記述できないのは仕様です。
    パフォーマンス上の理由だったと思います。

    VB2008以降ならこういう書き方が出来ます。

    Dim a1 = new StrctTest() with { .Data1 = 1, .Data2 = 2, .Data3 = "ABC", .Data4 = "DEF" }

    メンバー数が非常に多いようなら値型(structure)は不向きです。クラスの使用を考えましょう。

    2011年2月19日 8:21
  • 皆様、お返事ありがとうございます。

    言われてみれば構造体に固執する必要も特にないので、
    クラスに変更しようと思います。


    ありがとうございました。
    また何かありましたら、よろしくお願いします。

    2011年2月21日 4:22