VB.NET って分かり辛い

イライラして来るわ。
ByVal とか ByRef とかって昔からあるんだけどさ。VB6 の頃から思ってたんだけど VB ってこの辺りが良く分からん。C++ だともっと明確なのにさあ。C++ だと以下の様な感じでしょう。
struct を値渡しすればコピーは多く値の変更は出来ない。
struct * を値渡しすればコピーは少なく値の変更は出来る( ポインタ自身は変更不可 )。
struct * を const 値渡しすればコピーは少なく値の変更は出来ない( const キャストすれば変更可、ポインタ自身は変更不可 )。
struct を参照渡しすればコピーは少なく値の変更は出来る。
struct * を参照渡しすればコピーは少なく値の変更は出来る( ポインタ自身も変更可 )。
struct * を const 参照渡しすればコピーは少なく値の変更は出来る( const キャストすればポインタ自身も変更可 )。
VB.NET だと Class とか Structure とか ByRef とか ByVal とか妙な表現で分かり辛いんだよ…。Class は参照型だから実質ポインタだろ、それを ByVal 渡しすれば中身を変更可能って事だよな?違うのか?String も Object を継承してるから同じ理屈の筈…。MSDN ドキュメントが分かり辛い。試してみないと分からん…。