none
構造体配列を初期化する方法はありますか? RRS feed

  • 質問

  • お世話になっております。
    初歩的な質問で恐れ入ります。

    VB.NETで
    構造体の配列を初期化する構文はありますでしょうか?
    たとえばVC++では
    struct T {
    	int i;
    	char *p;
    };
    
    T v[] = {
    	1,"test1",
    	2,"test2"
    };
    

    のように初期化が可能ですが、VB.NETで
    Structure T
        Public i As Integer
        Public s As String
    End Structure
    
    Private v() As T = {(New T), (New T), (New T)}
    

    といった初期値を与えない初期化まではできたのですが、
    明示的に初期値を与えて初期化する方法はあるものでしょうか?

    恐れ入りますが、宜しくお願い致します。
    • 編集済み DEKOCHAN 2009年6月22日 7:32 行間調整
    2009年6月22日 7:30

回答

すべての返信

  • 構造体にコンストラクタを用意すればいいかと。
    • 回答としてマーク DEKOCHAN 2009年6月26日 7:36
    2009年6月22日 7:36
  • もちろん、コンストラクタを用意した方がいいですが、

    VB.NET 2008からオブジェクト初期化子 という書式をサポートしているそうです。
    # 私自身はVBを書いたことないので…。
    • 回答としてマーク DEKOCHAN 2009年6月26日 7:36
    2009年6月22日 9:44
  • Hongliang様 佐祐理様

    ご回答どうも有難う御座います。

    .NET の構造体(Structure)は、かつてのVBのそれ(Type)と違って
    C++のようにクラスに酷似して
    コンストラクタやメソッドまで持てる様になったのですね。

        Structure T
            Public Sub New(ByVal n As Integer, ByVal v As String)
                i = n
                s = v
            End Sub
    
            Public i As Integer
            Public s As String
        End Structure
    
        Private v() As T = {New T(0, "A"), New T(1, "B"), New T(2, "C")}
    VS2008でコーディングしていると With というキーワードがたびたびインテリセンスに出てきて
    何なのだろう?と思っていましたが(これに続くキーワードを出せるものかインテリセンスを利かせてみても出てこないので、何に使うのだろう?という疑問の段階で止まってしまっていました)、
    お蔭様で知ることが出来ました。

        Structure T
            Public i As Integer
            Public s As String
        End Structure
    
        Private v() As T = {New T With {.i = 0, .s = "A"}, New T With {.i = 1, .s = "B"}, New T With {.i = 2, .s = "C"}}
    

    With句のキーワードはVB6などのWith...End Withがもとのようで、さらに匿名型と呼ばれる構造体を作ることができるようになり、定義するときにこのWith句が使われるとか・・・

    Dim annonyVar = New With {.SerialNo = 120, .Name = "ABC"}
    2009年6月26日 7:36