いまさらだがByValとByRefについて

ByVal ptr As Class1 → Class1* const ptr
ByRef ptr As Class1 → Class1* ptr

かと思っていたが少し違うようだ。
ByValで渡してやってもメンバの中身が変更できない場合があったりする。
単純に

    Public Function hoge() As String
        Dim e As New Class2
        huga(e)
        Return e.foo.ToString
    End Function

    Private Sub huga(ByVal e As Class2)
        e.foo = 500
    End Sub

とかすると関数hogeは期待通り"500"を返すのだけど、
メンバ構成が複雑だとNGなケースがあるようだ。
社内のクラスライブラリを利用していたときそんなことがあったのだが、気のせいかもしれない。