ここから本文です

【.Net】型についての質問

トム・ヨークさん

2011/1/2317:28:50

【.Net】型についての質問

今のPJで他人の作ったものを見てて疑問が出てきました。昔から疑問だったんですが…。
メソッドの殆どの引数がByValで渡してるんです。
Javaだと型によって厳密なルールがあるんで渡し方なんてあんまり意識しないんですが、
今取り組んでるソースは、Javaなら参照渡しのはずのところも全部ByValです(例えば取得したデータテーブル等の大きそうなオブジェクトも)。
別に引数の書き換えとかないんでそれはそれでいいんですが

質問1.
自分でメソッドを追加する時も、この習慣にのっとって、よほどの事がなければByValで良いでしょうか?

質問2.
これは.Netの伝統的手法なのでしょうか?ではByRefはいつ使うのでしょう?

質問3
例えばint型(VBだとInteger型)やstring型なんかをByRefで渡したりは、しない方がいいと思うんですが(string型ならJavaだと警告が出るのでStringBuilderやStringBufferを使ってます。まぁ当然ですが。)、してますか?


それとも私はByVal や ByRefに関して何か誤解してるのでしょうか?誤解してるとしたら間違いを指摘して下さるよう、お願いします。

閲覧数:
415
回答数:
2

違反報告

ベストアンサーに選ばれた回答

2011/1/2319:01:53

コレ、VB の伝統的なところなんですが、Integer などの値型は ByVal とすれば値渡しになりますし、ByRef にすれば参照渡しになります。しかし、String 以外の参照型の場合、ByVal にしようが ByRef にしようが、問答無用で参照渡しになります。
(結構、笑える仕様になってます。)
しかも、参照型に対して ByVal を使用しても普通は何の警告もありません。(もしかするとオプションの設定で警告扱いにできるかもしれませんが、よくわかりません。)

次のプログラムを実行してみるとわかると思います。

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim c1 As New TestClass
c1.s = "ABC"
Test1(c1)
MessageBox.Show(c1.s, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)

Dim s As String = "ABC"
Test2(s)
MessageBox.Show(s, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)

End Sub

Private Sub Test1(ByVal c As TestClass)
c.s = "XYZ"
End Sub

Private Sub Test2(ByVal s As String)
s = "XYZ"
End Sub

End Class

Public Class TestClass
Public s As String
End Class

値型、参照型については↓を参照ください。
http://msdn.microsoft.com/ja-jp/library/dd314344.aspx


たぶん、何も考えずに全て ByVal にしておけば参照型に対しては勝手に参照渡しにしてくれるから、全て ByVal にしているんじゃないでしょうか。

質問した人からのコメント

2011/1/24 07:49:51

感謝 お二方ともありがとうございました。伝統だったんですね~。今までこんなんで大丈夫なのか不安でしたが、ByValでも参照渡ししているのを知って安心しました…w

ベストアンサー以外の回答

1〜1件/1件中

kso********さん

2011/1/2317:56:13

質問1
はい。.Netのソースにあまりそういうのがない、コードがわかりにくくなるなどの理由で、よほどのことがないかぎり、ByValを使っています。

質問2
ByRefは私の場合、自分だけで使うプログラムの場合、2つ以上の値を返したいときに時々使います。C言語と違って、&などをつけなくてよいので、コードがわかりにくくなってしまうので、ほかの人が読む可能性があるコードには使っていません。

質問3
stringなど、全部値渡しで呼び出しています。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる