- PR -

String型の値渡し

投稿者投稿内容
みすたーX
会議室デビュー日: 2005/08/20
投稿数: 4
投稿日時: 2005-08-20 17:21
VB.netではStringは参照型(値そのものが格納されているのではなくて参照情報が格納されている。)だというのを知ったのですが、
String型の変数を参照渡し(Byval)で渡した場合、呼び出し元の変数にも影響するのでしょうか?
クラスやデータセットが参照渡しで渡しても呼び出し元に影響するのは知っていたのですが・・・。
どなたかご教授お願いいたします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-20 17:38
疑問に思ったことはまず自分で試しましょう。すぐ確かめられることですし。
あとMSDNを調べるのも良い手段ですね。

ところでByValで渡すのは値です(文字通りBy Value=値によって、ですから)。
参照型の場合は参照の値を渡すってことですね。
参照渡しとはByRefで渡すことです。
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-08-20 17:40
【文字列の振る舞いの違い】
VB 6(Visual Basic 6.0)のString型は内容を書き換えられる。
しかし、VB.NETのString型は内容を書き換えられない。
VB.NETでは、文字列の加工は、特別な状況を除き、別の文字列型オブジェクトを作成することを意味する。

と書いてあるんで、文字列の加工は他の方法を考えたらいいんじゃないですか?

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet31/vb6tonet31_01.html

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-20 17:43
そもそも、参照渡しなんてやめましょう。
値渡しして、加工したものを return しましょう。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-08-20 17:46
データが値型か参照型か。メソッドに渡す方法が値渡しか参照渡しか。
これらは区別して考えたほうが良いです。
コード:
{
	string a = "aiueo";
	Func1(ref a);
}

private static void Func1(ref string para)
{
	para = "kakikukeko";
}


としてみたらどうなるか?(C#ですみません…)
試してみたらすぐ分かるのでは?
みすたーX
会議室デビュー日: 2005/08/20
投稿数: 4
投稿日時: 2005-08-20 17:52
すみません。質問が間違えてました。

誤)String型の変数を参照渡し(Byval)で渡した場合、
正)String型の変数を値渡し(Byval)で渡した場合、

String型は参照型なので値渡し(Byval)で渡したとしても実際は値じゃなくて参照情報がわたされるので、
渡された先で値が変更された場合、呼び出し元の値も変更されてしまうのか?と思ったのですが、サンプルのプログラムを作って動かしたところ呼び出し元の変数の値は変更されていませんでした。
この考え方はそもそも間違っているのでしょうか?
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-08-20 17:57
環境がないのでテストできませんが

参照情報のコピーが渡っているんじゃないですか?
参照情報の参照情報が渡っていれば変化するかも知れませんが
内部の仕様、挙動が解からない状態でイロイロするのは危険だと思います。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-08-20 18:01
引用:

String型は参照型なので値渡し(Byval)で渡したとしても実際は値じゃなくて参照情報がわたされるので、
渡された先で値が変更された場合、呼び出し元の値も変更されてしまうのか?と思ったのですが、サンプルのプログラムを作って動かしたところ呼び出し元の変数の値は変更されていませんでした。
この考え方はそもそも間違っているのでしょうか?



いえ。参照型の話で言ったら正解だとおもいます。
しかし、変更とは一体どういうことを指してますか?新しい文字列を作ってるだけではないでしょうか?

--追記
文字列変数が指している文字データの実体は変更することができない。つまり、
string a = "aiueo";
a.Replace("a", "y");
とかしても、a は"yiueo" とはなりませんよね?

[ メッセージ編集済み 編集者: 囚人 編集日時 2005-08-20 18:18 ]

スキルアップ/キャリアアップ(JOB@IT)