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

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

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

Re[6]: クラスのList


(過去ログ 136 を表示中)

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

■79948 / inTopicNo.1)  クラスのList
  
□投稿者/ mh001 (1回)-(2016/05/30(Mon) 19:01:30)

分類:[.NET 全般] 

初めて質問させていただきます。

さて、このようなクラスがあるとき、

public class test
{
public string name;
}

以下のイベントを発生させます。

//---------------------------------------------------------------
private void button1_Click(object sender, EventArgs e)
{
test t = new test();
List<test> temp = new List<test>();

//-------------------
t.name = "あ";

temp.Add(t);//
MessageBox.Show(temp[0].name);//@

//-------------------
t.name = "い";

temp.Add(t);
MessageBox.Show(temp[1].name);//A

for (int i = 0; i < temp.Count;i++ ) {
MessageBox.Show(temp[i].name);//B
}
}

//---------------------------------------------------------------
その結果がこうなりました。
@の出力は「あ」
Aの出力は「い」
Bの出力は「い」「い」

Bの出力が「あ」「い」となるものと考えていたのですが、
うまくいきませんでした。
勘違いしているでおろう部分をご指摘いただければ幸いです。
引用返信 編集キー/
■79950 / inTopicNo.2)  Re[1]: クラスのList
□投稿者/ とっちゃん (365回)-(2016/05/30(Mon) 19:15:26)
No79948 (mh001 さん) に返信
> 初めて質問させていただきます。
>
> さて、このようなクラスがあるとき、
>
> public class test
> {
> public string name;
> }
>
> 以下のイベントを発生させます。
>
> //---------------------------------------------------------------
> private void button1_Click(object sender, EventArgs e)
> {
> test t = new test();
> List<test> temp = new List<test>();
>
> //-------------------
> t.name = "あ";
>
> temp.Add(t);//
> MessageBox.Show(temp[0].name);//@
>
> //-------------------
> t.name = "い";
>
> temp.Add(t);
> MessageBox.Show(temp[1].name);//A
>
> for (int i = 0; i < temp.Count;i++ ) {
> MessageBox.Show(temp[i].name);//B
> }
> }
>
> //---------------------------------------------------------------
> その結果がこうなりました。
> @の出力は「あ」
> Aの出力は「い」
> Bの出力は「い」「い」
>
> Bの出力が「あ」「い」となるものと考えていたのですが、
> うまくいきませんでした。
> 勘違いしているでおろう部分をご指摘いただければ幸いです。

List<test> に入るオブジェクトは、参照オブジェクトです。
tが同じまま(中身は変わっていますが)2回セットするので、最後に変更した内容が
全部に反映されています。

1,2で違うものにしたいときは、
1回目の temp.Add(t); の後に
t = new test();
ともう一度行うことで、2回目に追加する t が別のものになります。

より詳しくは、入門書の類を読んでみてください。

引用返信 編集キー/
■79952 / inTopicNo.3)  Re[2]: クラスのList
□投稿者/ mh001 (2回)-(2016/05/30(Mon) 19:38:50)
2016/05/30(Mon) 19:40:17 編集(投稿者)

No79950 (とっちゃん さん) に返信
> ■No79948 (mh001 さん) に返信
>>初めて質問させていただきます。
>>
>>さて、このようなクラスがあるとき、
>>
>>public class test
>>{
>> public string name;
>>}
>>
>>以下のイベントを発生させます。
>>
>>//---------------------------------------------------------------
>> private void button1_Click(object sender, EventArgs e)
>> {
>> test t = new test();
>> List<test> temp = new List<test>();
>>
>> //-------------------
>> t.name = "あ";
>>
>> temp.Add(t);//
>> MessageBox.Show(temp[0].name);//@
>>
>> //-------------------
>> t.name = "い";
>>
>> temp.Add(t);
>> MessageBox.Show(temp[1].name);//A
>>
>> for (int i = 0; i < temp.Count;i++ ) {
>> MessageBox.Show(temp[i].name);//B
>> }
>> }
>>
>>//---------------------------------------------------------------
>>その結果がこうなりました。
>>@の出力は「あ」
>>Aの出力は「い」
>>Bの出力は「い」「い」
>>
>>Bの出力が「あ」「い」となるものと考えていたのですが、
>>うまくいきませんでした。
>>勘違いしているでおろう部分をご指摘いただければ幸いです。
>
> List<test> に入るオブジェクトは、参照オブジェクトです。
> tが同じまま(中身は変わっていますが)2回セットするので、最後に変更した内容が
> 全部に反映されています。
>
> 1,2で違うものにしたいときは、
> 1回目の temp.Add(t); の後に
> t = new test();
> ともう一度行うことで、2回目に追加する t が別のものになります。
>
> より詳しくは、入門書の類を読んでみてください。
>

早速ご回答頂きありがとうございます。

t = new test();
を挿入することにより、希望どおりの結果を得ることができました。

参照オブジェクトをキーワードに、今一度勉強しようと思います。

ご指摘ありがとうございました。

引用返信 編集キー/
■79954 / inTopicNo.4)  Re[3]: クラスのList
□投稿者/ WebSurfer (917回)-(2016/06/01(Wed) 10:52:24)
No79952 (mh001 さん) に返信

> 参照オブジェクトをキーワードに、今一度勉強しようと思います。

「C#」「値型」「参照型」などをキーワードにググるといろいろ参考になる記事が
見つかると思います。例えば下記:

値型と参照型の区別と違い クラスと構造体の違い
http://dobon.net/vb/dotnet/beginner/valuereference.html

(上の記事にも書いてありますが、string 型は参照型ながら中身を変更できないと
いう特殊性があります。もう一つ、インターンされるという特殊性がもあります。)


あと、今回の話とは直接関係ないですが、ボックス化とボックス化解除についても
今後のために知っておいたほうがよさそうです。

ボックス化とボックス化解除 (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/yz2be5wk.aspx

引用返信 編集キー/
■79968 / inTopicNo.5)  Re[4]: クラスのList
□投稿者/ mh001 (3回)-(2016/06/01(Wed) 18:48:33)
No79954 (WebSurfer さん) に返信
> ■No79952 (mh001 さん) に返信
>
>>参照オブジェクトをキーワードに、今一度勉強しようと思います。
>
> 「C#」「値型」「参照型」などをキーワードにググるといろいろ参考になる記事が
> 見つかると思います。例えば下記:
>
> 値型と参照型の区別と違い クラスと構造体の違い
> http://dobon.net/vb/dotnet/beginner/valuereference.html
>
> (上の記事にも書いてありますが、string 型は参照型ながら中身を変更できないと
> いう特殊性があります。もう一つ、インターンされるという特殊性がもあります。)
>
>
> あと、今回の話とは直接関係ないですが、ボックス化とボックス化解除についても
> 今後のために知っておいたほうがよさそうです。
>
> ボックス化とボックス化解除 (C# プログラミング ガイド)
> https://msdn.microsoft.com/ja-jp/library/yz2be5wk.aspx
>

非常にためになるページを教えていただき、ありがとうございました。

同じ参照先をListに追加していたため、意図しない結果が生じていたことが理解できました。
また、クラスと構造体は似た者同士だったと思ったのですが、クラスが参照型であるのに対して、
構造体が値型であることを知りました。

ボックス化については、なかなか難しそうですがステップアップのためにも
頑張ってみます。




引用返信 編集キー/
■79978 / inTopicNo.6)  Re[5]: クラスのList
□投稿者/ WebSurfer (924回)-(2016/06/02(Thu) 16:35:48)
No79968 (mh001 さん) に返信

最初の質問の問題は解決したと思いますが、そうであれば「解決済み」マークを付けて
おいていただくようお願いします。
引用返信 編集キー/
■79985 / inTopicNo.7)  Re[6]: クラスのList
□投稿者/ mh001 (4回)-(2016/06/02(Thu) 20:20:50)
2016/06/03(Fri) 14:08:51 編集(投稿者)

No79978 (WebSurfer さん) に返信
> ■No79968 (mh001 さん) に返信
>
> 最初の質問の問題は解決したと思いますが、そうであれば「解決済み」マークを付けて
> おいていただくようお願いします。

回答していただき、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -