C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[17]: 参照型の値渡しについて


(過去ログ 133 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■78839 / inTopicNo.1)  参照型の値渡しについて
  
□投稿者/ DD (3回)-(2016/02/20(Sat) 23:15:34)

分類:[C#] 

C#を勉強しております。
参照型の値渡しについて、色々なサイトで調べていますが、疑問点があります。
参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
呼び出し元のプロパティは更新されると記載がありました。

実際プログラムを記載する上で、渡されたオブジェクトのプロパティを更新するような
使い方をする場面があるでしょうか?
使いどころがよくわかりません。

どなたかご教示お願いします。
引用返信 編集キー/
■78841 / inTopicNo.2)  Re[1]: 参照型の値渡しについて
□投稿者/ Azulean (600回)-(2016/02/21(Sun) 00:50:01)
2016/02/21(Sun) 00:51:10 編集(投稿者)

No78839 (DD さん) に返信
> 参照型の値渡しについて、色々なサイトで調べていますが、疑問点があります。
> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

ref キーワードつきだと参照渡しで、キーワードなしだと値渡しという解釈かな?


> 実際プログラムを記載する上で、渡されたオブジェクトのプロパティを更新するような
> 使い方をする場面があるでしょうか?
> 使いどころがよくわかりません。

たとえば、Paint イベントでは PaintEventArgs というクラスが e として渡ってきます。
このクラスのプロパティには Graphics というプロパティがあり、描画のためのメソッドを呼び出したり、描画のモードを変えるためにプロパティを操作したりします。
類似例としては FormClosing というイベントで CancelEventArgs というクラスで渡されてきて、Cancel プロパティを true に変更すると、閉じるのをキャンセルすることができます。

このようにイベントの引数は書き換えるといったことはありますね。
その他にもあると思いますが、思い浮かべやすい例として。


個人的にはイベントみたいな不可避なものは仕方ないとしても、基本は引数を書き換えたり、状態を変えたりせず、戻り値で新しいオブジェクトを返す側が好ましいとは思っています。
引用返信 編集キー/
■78842 / inTopicNo.3)  Re[1]: 参照型の値渡しについて
□投稿者/ WebSurfer (828回)-(2016/02/21(Sun) 00:58:02)
No78839 (DD さん) に返信

> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

どこに記載があったのか、MSDN ライブラリなどであればその URL を書いていただけませんか。
引用返信 編集キー/
■78845 / inTopicNo.4)  Re[2]: 参照型の値渡しについて
□投稿者/ DD (4回)-(2016/02/21(Sun) 09:04:52)
No78841 (Azulean さん) に返信
> 2016/02/21(Sun) 00:51:10 編集(投稿者)
>
> ref キーワードつきだと参照渡しで、キーワードなしだと値渡しという解釈かな?
>
そのような解釈です

>
>>実際プログラムを記載する上で、渡されたオブジェクトのプロパティを更新するような
>>使い方をする場面があるでしょうか?
>>使いどころがよくわかりません。
>
> たとえば、Paint イベントでは PaintEventArgs というクラスが e として渡ってきます。
> このクラスのプロパティには Graphics というプロパティがあり、描画のためのメソッドを呼び出したり、描画のモードを変えるためにプロパティを操作したりします。
> 類似例としては FormClosing というイベントで CancelEventArgs というクラスで渡されてきて、Cancel プロパティを true に変更すると、閉じるのをキャンセルすることができます。
>
> このようにイベントの引数は書き換えるといったことはありますね。
> その他にもあると思いますが、思い浮かべやすい例として。
>


ありがとうございます
そのような場合もあるということですね
勉強になりました。

>
> 個人的にはイベントみたいな不可避なものは仕方ないとしても、基本は引数を書き換えたり、状態を変えたりせず、戻り値で新しいオブジェクトを返す側が好ましいとは思っています。

やはりそちらのほうが安全な気がします。
気を付けていきたいと思います。
引用返信 編集キー/
■78846 / inTopicNo.5)  Re[2]: 参照型の値渡しについて
□投稿者/ DD (5回)-(2016/02/21(Sun) 09:06:26)
No78842 (WebSurfer さん) に返信
> ■No78839 (DD さん) に返信
>
> どこに記載があったのか、MSDN ライブラリなどであればその URL を書いていただけませんか。

この辺りを参考にしました

https://msdn.microsoft.com/ja-jp/library/490f96s2.aspx
https://msdn.microsoft.com/ja-jp/library/s6938f28.aspx
引用返信 編集キー/
■78848 / inTopicNo.6)  Re[3]: 参照型の値渡しについて
□投稿者/ WebSurfer (831回)-(2016/02/21(Sun) 13:01:34)
No78846 (DD さん) に返信

参考にされている MSDN ライブラリの中には、

> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

という記述は見つけられませんでした・・・が、要するにメソッドの引数として ref を付け
る/付けないで何が違うのかという話と理解してレスします。

ref を付ける/付けないの話の前に、(1) 値型と参照型の違い、(2) 変数のスコープ、(3) 引数
を渡す仕組み、が理解できていないとなかなか話が通じにくいのですが、そのあたりは問題ない
でしょうか?

ちょっと不安ということであれば、(1) については以下の記事を一読してください。面倒であれ
ば「図 2-1 値型変数と参照型変数の値の代入」だけでも見れば理解が深まると思います。

2-3 値型と参照型
https://msdn.microsoft.com/ja-jp/library/cc406735.aspx

(2) と (3) については、質問者さんが参考にされている後者の記事(URL 下記)のコードを例
に説明してみます。

参照型のパラメーターの引き渡し (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/s6938f28.aspx

Change メソッドの引数 pArray は int 型配列のオブジェクトの実体ではなく、オブジェクトが
メモリ上のどこにあるかを指すポインタのようなもの(「図 2-1 値型変数と参照型変数の値の
代入」で言うと nnnn という値を保持する変数 s に相当)という理解はよろしいですか?

それは「値による参照型の引き渡し」のコード(ref を付けない方)の Change メソッドでも、
「参照による参照型の引き渡し」のコード(ref を付けた方)の Change メソッドでも同じこと
です。

で、ref が付く/付かないで何が違うのかというと、

・ref を付けない方:Main で Change(arr) が呼び出される際、変数 arr の値が変数 pArray
 にコピーされる。変数 arr と変数 pArray は別物でスコープはそれぞれ Main メソッド、
 Change メソッド内に限られる。

 ただし、渡した時点では同じオブジェクトを指しているので pArray を操作してオブジェクト
 の中身を書き換える(コードでは pArray[0] = 888;)ことができる。

 pArray = new int[5] {-3, -1, -2, -3, -4}; とすると新たにオブジェクトが作られそれへの
 ポインタが pArray に代入される。Main メソッドの変数 arr が指すオブジェクトは変わらな
 い。なので、変数 arr と変数 pArray が指すオブジェクトは別ものになる。

・ref を付けた方:変数 arr と変数 pArray は同じものになる。上と違って、コピーではなく、
 入れ物自体が同じになる。

 なので、Change メソッドで pArray = new int[5] {-3, -1, -2, -3, -4}; とすると Main メ
 ソッドの変数 arr も同じオブジェクトを指すようになる。

ということになります。

なので、

> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

というのはちょっと理解が違うのではないかと思います。また、

> 実際プログラムを記載する上で、渡されたオブジェクトのプロパティを更新するような
> 使い方をする場面があるでしょうか?

は普通に行うことで、ref が付く/付かないには直接関係ない話だと思います。

引用返信 編集キー/
■78857 / inTopicNo.7)  Re[4]: 参照型の値渡しについて
□投稿者/ DD (6回)-(2016/02/21(Sun) 18:35:55)
No78848 (WebSurfer さん) に返信
> ■No78846 (DD さん) に返信
>
> 参考にされている MSDN ライブラリの中には、
>
>>参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
>>呼び出し元のプロパティは更新されると記載がありました。
>
> という記述は見つけられませんでした・・・が、要するにメソッドの引数として ref を付け
> る/付けないで何が違うのかという話と理解してレスします。
>
細かい説明ありがとうございます。
理解が深まりました。

実際そのような記載があったサイトはMSDNではなく、以下サイトでした
http://dobon.net/vb/dotnet/beginner/byvalbyref.html

引用返信 編集キー/
■78858 / inTopicNo.8)  Re[5]: 参照型の値渡しについて
□投稿者/ WebSurfer (835回)-(2016/02/21(Sun) 19:12:57)
No78857 (DD さん) に返信

> 実際そのような記載があったサイトはMSDNではなく、以下サイトでした
> http://dobon.net/vb/dotnet/beginner/byvalbyref.html

以下の部分ですよね?

"このようにパラメータが参照型ならば、値渡しであっても、メソッド内でパラメータのプロ
パティ値を変更すると、呼び出し元の引数のプロパティ値も変わります。ただし、引数として
渡された変数の参照先を変更するためには、参照渡しにしなければなりません。"

それを質問者さんが、

> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

と書き換えたとすると、自分的にはどうもすっきりしません。

参照型が値渡し(ref 無し)であろうと参照渡し(ref 付き)であろうと、渡された参照型か
らプロパティを通じてその参照型が指すオブジェクトの中身にはアクセスできる、変更できる
ようになっていれば変更できる・・・ということになると思うのですが。

参照渡しにすると何が違うかというと、先のレスで書きましたように、「変数 arr と変数
pArray は同じものになる。なので、Change メソッドで

pArray = new int[5] {-3, -1, -2, -3, -4};

とすると Main メソッドの変数 arr も同じオブジェクトを指すようになる」ということなの
ですが、話は通じてますでしょうか?

引用返信 編集キー/
■78859 / inTopicNo.9)  Re[6]: 参照型の値渡しについて
□投稿者/ DD (7回)-(2016/02/21(Sun) 20:55:19)
No78858 (WebSurfer さん) に返信
> ■No78857 (DD さん) に返信
>
>>実際そのような記載があったサイトはMSDNではなく、以下サイトでした
>>http://dobon.net/vb/dotnet/beginner/byvalbyref.html
>
> 以下の部分ですよね?
>
> "このようにパラメータが参照型ならば、値渡しであっても、メソッド内でパラメータのプロ
> パティ値を変更すると、呼び出し元の引数のプロパティ値も変わります。ただし、引数として
> 渡された変数の参照先を変更するためには、参照渡しにしなければなりません。"
>
> それを質問者さんが、
>
>>参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
>>呼び出し元のプロパティは更新されると記載がありました。
>
> と書き換えたとすると、自分的にはどうもすっきりしません。
>
> 参照型が値渡し(ref 無し)であろうと参照渡し(ref 付き)であろうと、渡された参照型か
> らプロパティを通じてその参照型が指すオブジェクトの中身にはアクセスできる、変更できる
> ようになっていれば変更できる・・・ということになると思うのですが。
>
すみません。
質問時は参照型の値渡しの場合のみの事を聞きたかった為、そのような記載をしてしまいました。
そのサイトでの記載はWebSurferさんの解釈通りだと思います。

> 参照渡しにすると何が違うかというと、先のレスで書きましたように、「変数 arr と変数
> pArray は同じものになる。なので、Change メソッドで
>
> pArray = new int[5] {-3, -1, -2, -3, -4};
>
> とすると Main メソッドの変数 arr も同じオブジェクトを指すようになる」ということなの
> ですが、話は通じてますでしょうか?
はい。理解することができました。
ありがとうございました。
引用返信 編集キー/
■78865 / inTopicNo.10)  Re[7]: 参照型の値渡しについて
□投稿者/ WebSurfer (837回)-(2016/02/22(Mon) 12:55:48)
No78859 (DD さん) に返信

解決したのであれば「解決済み」マークを付けていただくようお願いします。

もし解決しておらず、まだ疑問などがある場合はその旨書いてください。
引用返信 編集キー/
■78866 / inTopicNo.11)  Re[8]: 参照型の値渡しについて
□投稿者/ DD (8回)-(2016/02/22(Mon) 13:14:54)
No78865 (WebSurfer さん) に返信
> ■No78859 (DD さん) に返信
>
> 解決したのであれば「解決済み」マークを付けていただくようお願いします。
>
> もし解決しておらず、まだ疑問などがある場合はその旨書いてください。

解決に致します
解決済み
引用返信 編集キー/
■78867 / inTopicNo.12)  Re[9]: 参照型の値渡しについて
□投稿者/ Z-Axis (1回)-(2016/02/22(Mon) 13:43:54)

> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、
> 呼び出し元のプロパティは更新されると記載がありました。

質問者の意図として、この考えは正しいですよ。
解決済み
引用返信 編集キー/
■78872 / inTopicNo.13)  Re[10]: 参照型の値渡しについて
□投稿者/ WebSurfer (838回)-(2016/02/22(Mon) 22:18:11)
No78867 (Z-Axis さん) に返信

どこの誰だか知らないが、今頃出てきて何が言いたいの?

あなたが他人の意図がどうしてわかるのか知らんが、分かるのであれば私のレスなん
かほっといて、あなたが質問者さんの意図を汲んで回答したらどうですか?
解決済み
引用返信 編集キー/
■78873 / inTopicNo.14)  Re[11]: 参照型の値渡しについて
□投稿者/ なちゃ (96回)-(2016/02/22(Mon) 23:09:27)
No78872 (WebSurfer さん) に返信
> ■No78867 (Z-Axis さん) に返信
>
> どこの誰だか知らないが、今頃出てきて何が言いたいの?
>
> あなたが他人の意図がどうしてわかるのか知らんが、分かるのであれば私のレスなん
> かほっといて、あなたが質問者さんの意図を汲んで回答したらどうですか?

いい加減にしなさい。
掲示板をなんだと思っているのか?
あなたは掲示板のみマナーがどうと散々うるさく言っているが、あなたのその書き込みはあなたの中ではマナーを守っているのか?
前もいつだったか他人をいきなりなりすまし呼ばわりしてして人間のくずとまで言いがかりをつけて、否定されても謝罪も無し。

どんなマナーですか?
ほんとに大概にしときなさい。
引用返信 編集キー/
■78874 / inTopicNo.15)  Re[12]: 参照型の値渡しについて
□投稿者/ WebSurfer (839回)-(2016/02/22(Mon) 23:54:19)
No78873 (なちゃ さん) に返信

またあなたか・・・ ひょっとして Z-Axis さんというのもあなた? 何か恨
みでもあるのかしら・・・

スレッドの質問と関係ないことで何か個人的に言いたいことがあるなら、他人の
スレッドに便乗して余計なノイズを増やすのは止めて、自分で新たに別スレッド
を立ててそこに書いてはいかが?

解決済み
引用返信 編集キー/
■78875 / inTopicNo.16)  Re[13]: 参照型の値渡しについて
□投稿者/ なちゃ (97回)-(2016/02/22(Mon) 23:59:41)
No78874 (WebSurfer さん) に返信
> ■No78873 (なちゃ さん) に返信
>
> またあなたか・・・ ひょっとして Z-Axis さんというのもあなた? 何か恨
> みでもあるのかしら・・・
>
> スレッドの質問と関係ないことで何か個人的に言いたいことがあるなら、他人の
> スレッドに便乗して余計なノイズを増やすのは止めて、自分で新たに別スレッド
> を立ててそこに書いてはいかが?
>

あなたの書き込みがまずノイズです。
それからまたなりすましと言いがかりか。
全く違いますから謝罪してください。
うらみ?
あなたちょっともうどうかしてるんじゃない?


引用返信 編集キー/
■78876 / inTopicNo.17)  Re[14]: 参照型の値渡しについて
□投稿者/ なちゃ (98回)-(2016/02/23(Tue) 00:01:23)
またあなたか?
と言ったという事は、そのまえにまたと言われなにかがあったと言いたいのですね?
ドレのことですか?
またとか恨みとか言われる書き込みを示してください。
言いがかりならばそれも謝罪してください。

引用返信 編集キー/
■78877 / inTopicNo.18)  Re[15]: 参照型の値渡しについて
□投稿者/ WebSurfer (840回)-(2016/02/23(Tue) 00:04:33)
No78876 (なちゃ さん) に返信

もう一回だけ言うけど、

スレッドの質問と関係ないことで何か個人的に言いたいことがあるなら、他人の
スレッドに便乗して余計なノイズを増やすのは止めて、自分で新たに別スレッド
を立ててそこに書いてはいかが?

引用返信 編集キー/
■78878 / inTopicNo.19)  Re[15]: 参照型の値渡しについて
□投稿者/ なちゃ (100回)-(2016/02/23(Tue) 00:05:26)
気に入らないことがあればなりすまし呼ばわりノイズ呼ばわり。
本当にいい加減にしてください。
解決済み
引用返信 編集キー/
■78879 / inTopicNo.20)  Re[16]: 参照型の値渡しについて
 
□投稿者/ WebSurfer (841回)-(2016/02/23(Tue) 00:06:38)
解決済みチェックマークを付けるのを忘れました。
解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -