投稿者 るきお  (社会人) 投稿日時 2020/5/4 08:35:57
ByValの有無の違いについて

2点お伝えすることがあります。

1点目はsenderやeなどの引数の扱い方を示すキーワードとして、ByRef と ByVal があります。どちらも記述しなかった場合、ByVal が指定されたとみなされるということです。

つまり、もともと
(ByVal sender As ObjectByVal e As EventArgs) 


(sender As Object, e As EventArgs)

は同じ意味でした。


2点目は、ByRefを使うケースはほとんどなく、ByValを使うケースが圧倒多数ということです。

以上2点を背景として、2010年ごろに自動生成されるプログラムが短くなるようにByValを省略したほうがいいのではないかという提案が1ユーザーからMicrosoftに寄せられ、これがVisual Studio 2010 SP1で採用されました。
今でもこの2つは同じ意味なのでどちらを記述してもかまいませんが、自動生成されるプログラムはByValを省きます。

ByValとByRefの機能上の違いは、ByValの場合、呼び出されたプロシージャ(Sub ~ End Sub, Function ~ End Functionの塊)の中で、引数の値を変更した場合、呼び出し元には影響しないのに対し、ByRefは呼び出しもとの引数も変更されるという違いがあります。

キーワードは 値渡しと参照渡しです。
参考
http://rucio.o.oo7.jp/main/dotnet/shokyu/standard34.htm


System. の有無の違いについて

もう1つの違い System. の有無は、私はあまり意識したことはありませんでした。
もともとObjectやEventArgsを含め、すべてのクラスや構造体は何かの名前空間に属しており、同じ名前のクラスが別の名前空間に存在することもあります。
たとえば、Point構造体は System.Drawing名前空間のPointと、System.Windows名前空間のPointがあり、機能が微妙に違います。
このような同じ名前のクラスとの混同を避けるために、名前空間も含めたフルネーム(完全修飾名)でクラス名を記述することがしばしばあり、それがObjectとSystem.Object、EventArgsとSystem.EventArgsの違いです。つまり、記述方法が違うだけで同じことを表現しています。