• ベストアンサー
  • 困ってます

VB2008: 構造体に関するMSDNの解釈について!

' ================== ' 構造体変数の代入 ' ================== Module theTEST   Private Structure TEST4     Dim MembersCount As Integer     Dim Member1 As String     Dim Member2 As String   End Structure   Sub Main()     Dim T4_1 As TEST4     Dim T4_2 As TEST4     T4_1.MembersCount = 1     T4_1.Member1 = "T4_1:Member1"     T4_1.Member2 = "T4_1:Member2"     T4_2 = T4_1     Debug.Print(T4_2.MembersCount.ToString)     Debug.Print(T4_2.Member1)     Debug.Print(T4_2.Member2)   End Sub End Module [イミディエイト ウインドウ] 1 T4_1:Member1 T4_1:Member2 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 (http://msdn.microsoft.com/ja-jp/library/18ytyskd(VS.80).aspx) このMSDNライブラリの説明によると、 [イミディエイト ウインドウ] 0 T4_1:Member1 T4_1:Member2 という結果を得るというのが私の予測。 もしかしたら、MSDNライブラリの説明の舌足らず。 >構造体の要素が値型であらば値がコピーされますが、文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 ということでしょうか?

noname#140971

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数223
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • Tacosan
  • ベストアンサー率23% (3656/15482)

例の前に「一方の構造体のすべての要素が、もう一方の構造体の対応する要素にコピーされます」と書いてあるので, そこでカバーしているということじゃないかなぁ. 本当は参照型である場合もそこでカバーされているんだけど, 注意をうながす意味であえて書いているんじゃないかなと推測.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

納得です。 ありがとうございました。 ※確信がなかったもので・・・。 ありがとうございました。

関連するQ&A

  • クラス

    VB.NET 学習58日目という初学者です。 未だ、Sub Main() でシコシコと基本事項の確認中です。 やっと構造体の演習を昨日から。 案の定、わからないことに遭遇しました。 ' ============================== ' TEST1、TEST2 の BSave、BLoad ' ============================== Module theTEST1   Sub Main()     ' -----------------------     ' TEST1 の BSave、BLoad     ' -----------------------     Dim T1 As New TEST1     T1.Member1 = "T1.Member1"     T1.Member2 = "T1.Member2"     BSave(T1, "D:\Temp\T1.BIN")     T1.Member1 = "AAA"     T1.Member2 = "BBB"     Debug.Print(T1.Member1)     Debug.Print(T1.Member2)     T1 = CType(BLoad("D:\Temp\T3.BIN"), TEST1)     If T1.Member1 <> Nothing Then ' Null エラーが回避できない!       Debug.Print(T1.Member1)       Debug.Print(T1.Member2)     Else       Message("")     End If     ' -----------------------     ' TEST2 の BSave、BLoad     ' -----------------------     Dim T2 As TEST2     T2.Member1 = "T2.Member1"     T2.Member2 = "T2.Member2"     BSave(T2, "D:\Temp\T2.BIN")     T2.Member1 = "AAA"     T2.Member2 = "BBB"     Debug.Print(T2.Member1)     Debug.Print(T2.Member2)     T2 = CType(BLoad("D:\Temp\T3.BIN"), TEST2)     If T2.Member1 <> Nothing Then       Debug.Print(T2.Member1)       Debug.Print(T2.Member2)     Else       Message("")     End If   End Sub End Module Function BLoad(ByVal aPath As String) As Object   If File.Exists(aPath) Then     Try       Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read)         Dim bf As New BinaryFormatter         Dim aObject As Object = bf.Deserialize(fs)         fs.Close()         Return aObject       End Using     Catch ex As IOException       MsgBox(ex.Message & "(BLoad)", , "エラー:")       Return Nothing     End Try   Else     Return Nothing   End If End Function T1 はクラスライブラリで定義。 T2 は構造体。 構造体の場合は、Nothing でチェックできました。 しかし、クラスライブラリの場合はチェックできません。 このエラーの考え方と処し方を教えてください。 構造体とクラスライブラリは表向きは同じようなもの。 ですから、どちらにも通用する BSave、BLoad 関数を作成使用としたわけです。 宜しくお願いします。

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • VB2008: 構造体に関連して・・・。

    VB.Net を知って60日という初学者です。 プログラマではなくデザイナ。 ですから、未だに Sub Main() で基本事項の確認中です。 フォームなどの演習は、まーだ、当分はしない予定です。 さて、質問は構造体に関するMSDN の記述です。 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、 >データへのポインタがコピーされます。 この下り。 「なんでポインタがコピーされるんや」という疑問を抱きました。 ・文字列型にプロパティやメソッドという機能を付加するためにクラス型にした。 ・クラス型は、「・・・・」ということで参照型。と ・「・・・・」と同じ理由。 というように背景を推測しました。 この推測も単なるど素人の推測。 当を得たいるか?実に怪しい物。 仮に当らずとも遠からずとしても、肝心の「・・・・」がわかりません。 この辺りに関して、「このように考えてたらよい」という回答がありましたらお願いします。

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class

  • VB2008: 継承の場合のコンストラクタの書き方?

    ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _Member1 As String   Private _Member2 As String   ' //   ' // パラメータを持つ初期化   ' //   Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String)     _Member1 = aMember1     _Member2 = aMember2   End Sub End Class ' =========================== ' クラス TEST1 の派生クラス ' =========================== <Serializable()> Public Class NEWTEST1 Inherits TEST1 Private _Member1 As New TEST1 Private _Member2 As New TEST1 End Class これでもOKかと思うのですが・・・。 パラメータ化されていないコンストラクタをクラス TEST1 に書くように促すエラーがでます。 もちろん、パラメータを持たないコンストラクタを用意すればエラーは回避できます。 問題は、「Visual Basic のプログラミングガイド」からその理由を読み取れないことです。 >Visual Basic のオブジェクトの概要 >クラスについて >オブジェクトの作成と使用 まだ、ここしか読んでいません。 が、どうにも気になったので質問します。 1、エラーの回避策としては何が正しいのか? 2、その根拠は? この2つが知りたいです。

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class

  • VB.Net: クラスの共有メソッドの作り方?

    あと3日でVB.Net学習2ヶ月目という初学者です。 Sub Main() のみで基本事項の確認のみをしてきました。 ですから、フォーム、レポート、データベース、WEB関連の知識は完全にゼロ。 さて、その基本演習も最終段階に突入。 いよいよクラスです。 ' ============================== ' クラスプログラミング; 演習3 ' ============================== Module theClass   Sub Main()     Dim T1 As New TEST1     T1.Member1 = "T1.Member1"     T1.Member2 = "T1.Member2"     T1.BSave("D:\Temp\T1.bin", DirectCast(T1, Object)) <--- ?1     T1.Member1 = "AAA"     T1.Member2 = "BBB"     Debug.Print(T1.Member1)     Debug.Print(T1.Member2)     T1.BLoad("D:\Temp\T1.bin", T1) <--- ?2     If T1 IsNot Nothing Then       Debug.Print(T1.Member1)       Debug.Print(T1.Member2)     Else       Message("T1.bin は読み込めませんでした。")     End If   End Sub End Module ?1=インスタンスを経由する共有メンバ、・・・へのアクセスです。正規の式は評価されません。 ?2=Option strict on では、'ByRef' パラメータのオブジェクトの値を・・・縮小変換できませんでした。 Public Shared Sub BSave(ByVal aPath As String, ByVal aObject As Object)   Try     Using fs As New FileStream(aPath, FileMode.Create, FileAccess.Write)       Dim bf As New BinaryFormatter       bf.Serialize(fs, aObject)       fs.Close()     End Using   Catch ex As IOException     MsgBox(ex.Message & "(BSave)", MsgBoxStyle.Exclamation, "エラー:")   End Try End Sub Public Sub BLoad(ByVal aPath As String, ByRef aObject As Object)   If File.Exists(aPath) Then     Try       Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read)         Dim bf As New BinaryFormatter         aObject = bf.Deserialize(fs)         fs.Close()       End Using     Catch ex As IOException       MsgBox(ex.Message & "(BLoad)", MsgBoxStyle.Exclamation, "エラー:")     End Try   End If End Sub 非共有の BSaveメソッドとBLoadメソッドのパラメータはファイルパスだけ。 共有メソッドの場合は、「何を」というのが必要かと思って2つ目のパラメータを追加。 もって、構造体の BSave と BLoad とに援用するテストをしたいと思っています。 し、しかし、上述の2つのエラーを前にどうしてよいか皆目わかりません。 >そのエラーを回避、もしくは発生させないためには次のように改造したらよい! そういう回答等をお願いします。

  • CSVから構造体へ代入

    お世話になります。 Private Type TestRecord Col1 As String * 255 Col2 As String * 255 Col3 As String * 255 End Type Sub ボタン1_Click() Dim FName As String Dim FileNo As Integer Dim LineData As String Dim TestRec() As TestRecord FileNo = FreeFile '選択したファイル名の取得 FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV") If FName = "False" Then Exit Sub End If Open FName For Input As #FileNo Do Until EOF(FileNo) i = i + 1 Line Input #FileNo, LineData ReDim TestRec(i) TestRec() = Split(LineData, ",") Debug.Print buf Loop Close #FileNo End Sub ファイルの中身 "テストID1","テスト姓1","テスト名1" "テストID2","テスト姓2","テスト名2" 以上のコードを実行するとTestRec() =~の部分で型が一致しません とエラーが出てしまいます。 よき解決方法があれば教えてください。宜しくお願いします。

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • VBA 構造体の値参照

    いつもお世話になっています。 Access VBAにて構造体を作成し、その値をループで渡したいのですが、ご存知の方おられましたら、お助けください。 (例) Private Type HD_REC ID as string * 2 Name as string * 10 Lev as string * 50 End Type Function SetData() Dim rs As RecordSet Set rs = CurrentDB.OpenRecordSet("XXXXXXXX") While Not rs.EOF rs.Fields(i) = 'ここに構造体のID,Name,Levを渡したいのです。 i=i+1 Wend End Function よろしくお願いします。