こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クラス

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 関数を作成使用としたわけです。
宜しくお願いします。

投稿日時 - 2009-03-16 06:58:11

QNo.4800646

困ってます

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

T1などTEST1クラスのオブジェクトが Nothingかどうかを判別しましょう

  ' T1 = CType(BLoad("D:\Temp\T3.BIN"), TEST1)
  T1 = BLoad("D:\Temp\T3.BIN")
  ' でいいと思いますよ
  ' TEST1以外をデシリアライズしてきた場合は
  ' 代入のエラーになるので Try/Catchで対応かと
  If T1 IsNot Nothing Then ' Null エラーが回避できない!
   Debug.Print(T1.Member1)

# 2003以前なら
  If not (T1 Is Nothing) Then ' Null エラーが回避できない!
といった具合です

BLoadやBSaveを TEST1クラスの Sharedメソッドとして実装したほうがいいかもしれませんよ

投稿日時 - 2009-03-16 08:46:03

お礼

侍ジャパンを見ながら BLOAD、BSAVE を作成。
「NULL だから ISNOT NULL の要領かなー?」と思いましたが・・・。
結局は、悉く失敗。

回答の如くで成功しました。

>BLoadやBSaveを TEST1クラスの Sharedメソッドとして実装したほうがいいかもしれませんよ!

クラスライブラリは12、3年前に一度だけ作ったことがあるだけ。
で、構造体=>ファイルアクセス=>クラスライブラリと攻める予定です。
が、構造体とクラスとが余りにも表向きが一緒なものでチト踏み込んだ次第です。

アドバイスの<Sharedメソッドとして実装>の意味は皆目わかりませんが是非に挑戦したいと思います。

投稿日時 - 2009-03-16 09:17:25

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問