DOBON.NET DOBON.NETプログラミング掲示板過去ログ

StreamReader は ByVal ? ByRef ?

環境/言語:[WinXP、VB2005、.NET Framework 2.0]
分類:[.NET]

例えば、次のようなロジックがあったとします。

○ "c:\テキストファイル.txt" を読み込み、
  テキストファイル内の 1 行目と 3 行目の内容を ReadText メソッドで
  読み込み、2 行目の内容のみ Read_S2 メソッドで読み込む。

これを例えば以下のようなコードで書いたとします。

---------------------------------------------------

'変数
Private s1 As String
Private s2 As String
Private s3 As String


'テキストファイルから文字列を読み込むメソッド
Private Sub ReadText()

 Dim sr As new IO.StreamReader("C:\テキストファイル.txt")

 s1 = sr.ReadLine
 Read_S2(sr)  ' ← 別メソッドで s2 の読み込みを行う。
 s3 = sr.ReadLine

 sr.Close

End Sub


's2 のみ読み込むメソッド
Public Sub Read_S2(ByVal sr As IO.StreamReader)  ' ★

 s2 = sr.ReadLine

End Sub

---------------------------------------------------

以上のような書き方をした場合
(StreamReader オブジェクトを引数として渡す場合)、
StreamReader を受け取る側のメソッドでは、ByVal と ByRef の
どちらで受け取ればよいのでしょうか。(「' ★」をつけた行)
どちらも同じということはないと思い、何が違うのかわからなくなりました。
やはり、ByVal だとメソッドを出た時に読み込みポインタが戻って
しまったりするのでしょうか?

上記コードのように、StreamReader オブジェクトを
引数として別メソッドに渡さなければならない場合の渡し方について
どなたかご教授いただけませんでしょうか。
■No23731に返信(あんちくつしたさんの記事)
> 以上のような書き方をした場合
> (StreamReader オブジェクトを引数として渡す場合)、
> StreamReader を受け取る側のメソッドでは、ByVal と ByRef の
> どちらで受け取ればよいのでしょうか。(「' ★」をつけた行)
> どちらも同じということはないと思い、何が違うのかわからなくなりました。

普通は ByVal を使うでしょう。違いがわからないのは、値型と参照型、値渡しと参照渡しの区別がついていないからではないでしょうか。

> やはり、ByVal だとメソッドを出た時に読み込みポインタが戻って
> しまったりするのでしょうか?

読み込みポインタとは Read の位置のことでしょうか?
であれば参照型なので関係ないです (そもそも試せばわかることですが)。

> 上記コードのように、StreamReader オブジェクトを
> 引数として別メソッドに渡さなければならない場合の渡し方について
> どなたかご教授いただけませんでしょうか。

個人的には StreamReader 自体を渡したことは一度もないですが、まあ渡したいなら ByVal を使うでしょうね。
呼び出し元の '参照' を呼び出し先で変えたいわけではありませんから。
  • 題名: Re[2]: StreamReader は ByVal ? ByRef ?
  • 著者: あんちくつした
  • 日時: 2009/01/06 10:50:57
  • ID: 23733
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2009/01/06(Tue) 10:51:41 編集(投稿者)

じゃんぬねっと様
ご教授ありがとうございます。

■No23732に返信(じゃんぬねっとさんの記事)
> ■No23731に返信(あんちくつしたさんの記事)
>>以上のような書き方をした場合
>>(StreamReader オブジェクトを引数として渡す場合)、
>>StreamReader を受け取る側のメソッドでは、ByVal と ByRef の
>>どちらで受け取ればよいのでしょうか。(「' ★」をつけた行)
>>どちらも同じということはないと思い、何が違うのかわからなくなりました。
>
> 普通は ByVal を使うでしょう。違いがわからないのは、値型と参照型、値渡しと参照渡しの区別がついていないからではないでしょうか。

仰る通り、値型と参照型、値渡しと参照渡しの区別がついていませんでした。
単純に、変数を参照渡しすると渡し先のメソッド内での値変更が渡し元でも適用され、値渡しをすると渡し先での値変更が渡し元では適用されない、というような解釈の仕方をしていました。

>>やはり、ByVal だとメソッドを出た時に読み込みポインタが戻って
>>しまったりするのでしょうか?
>
> 読み込みポインタとは Read の位置のことでしょうか?

はい、Read の位置のことです。

> であれば参照型なので関係ないです (そもそも試せばわかることですが)。
>>上記コードのように、StreamReader オブジェクトを
>>引数として別メソッドに渡さなければならない場合の渡し方について
>>どなたかご教授いただけませんでしょうか。
>
> 個人的には StreamReader 自体を渡したことは一度もないですが、まあ渡したいなら ByVal を使うでしょうね。
> 呼び出し元の '参照' を呼び出し先で変えたいわけではありませんから。

了解しました。値型、参照型、値渡し、参照渡しの違いについて
調べてみようと思います。
StreamReader の渡し方については、これにて解決とさせていただきます。
ご教授ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板