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

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

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

Re[3]: 【C#】StringCollectionについて【仕様?】


(過去ログ 84 を表示中)

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

■50205 / inTopicNo.1)  【C#】StringCollectionについて【仕様?】
  
□投稿者/ 純@WAS (5回)-(2010/05/31(Mon) 10:06:32)

分類:[.NET 全般] 

お世話になります。

StringCollectionの値をHashtableに格納したときに、意図しない挙動になったので、仕様か確認させて下さい。

StringCollection strCol = new StringCollection();
Hashtable ht = new Hashtable();

for(条件分)
{
   if(条件分)
   {
      strCol.Add(xxxx);   //xxxxは変数です
   }
}

//Hashtableに格納する
ht.Add("xxxx", strCol);
//strCol使いまわしのため、値をクリア
strCol.Clear();

大雑把にはこのような感じのプログラムで以下の現象が発生します。
「ht.Add("xxxx", strCol);」を実行したときはht["xxxx"]のValueにはデータが入っているのですが、
直後の「strCol.Clear()」実行後のht["xxxx"]のValueには何も格納されていない状態になります。

このように一度格納した値についても、連動する仕様はあるのでしょうか。

引用返信 編集キー/
■50206 / inTopicNo.2)  Re[1]: 【C#】StringCollectionについて【仕様?】
□投稿者/ aetos (304回)-(2010/05/31(Mon) 10:15:26)
No50205 (純@WAS さん) に返信
> 大雑把にはこのような感じのプログラムで以下の現象が発生します。
> 「ht.Add("xxxx", strCol);」を実行したときはht["xxxx"]のValueにはデータが入っているのですが、
> 直後の「strCol.Clear()」実行後のht["xxxx"]のValueには何も格納されていない状態になります。
>
> このように一度格納した値についても、連動する仕様はあるのでしょうか。

はい。仕様です。
StringCollection が参照型であるために起こる現象です。
今後のためにも、値型と参照型について調べてみるのがよいでしょう。

http://www.bing.com/search?q=%E5%80%A4%E5%9E%8B%E3%81%A8%E5%8F%82%E7%85%A7%E5%9E%8B&src=IE-SearchBox&FORM=IE8SRC
引用返信 編集キー/
■50207 / inTopicNo.3)  Re[1]: 【C#】StringCollectionについて【仕様?】
□投稿者/ エクシ (20回)-(2010/05/31(Mon) 10:17:43)
No50205 (純@WAS さん) に返信
仕様というなら、むしろ Hashtable の仕様というべきかも。
計算結果を覚えるのではなく、もとのオブジェクトを格納しているのであれば
連動しているのではなく、そのものを変更しているだけですから、特に不思議
ではないですね。参照型変数を扱う上での常識かと。。
引用返信 編集キー/
■50208 / inTopicNo.4)  Re[1]: 【C#】StringCollectionについて【仕様?】
□投稿者/ よねKEN (512回)-(2010/05/31(Mon) 10:19:05)
2010/05/31(Mon) 10:20:23 編集(投稿者)

No50205 (純@WAS さん) に返信
> 「ht.Add("xxxx", strCol);」を実行したときはht["xxxx"]のValueにはデータが入っているのですが、
> 直後の「strCol.Clear()」実行後のht["xxxx"]のValueには何も格納されていない状態になります。
>
> このように一度格納した値についても、連動する仕様はあるのでしょうか。

StringCollectionに固有の話ではなく、参照型であれば同じような結果になります。
参照型と値型の違いを理解することは基本的でかつ非常に重要なことなので、
この機会に調べてみてください。
検索キーワードは「値型と参照型」です。

--
かぶりまくりorz
引用返信 編集キー/
■50209 / inTopicNo.5)  Re[2]: 【C#】StringCollectionについて【仕様?】
□投稿者/ みきぬ (900回)-(2010/05/31(Mon) 10:33:05)
ところで環境は .NET Framework 1.1 以前なのかしら。
もし 2.0 以降なら、よっぽどの理由がない限りは Dictionary や List とかのジェネリッククラスを使うほうが。
引用返信 編集キー/
■50211 / inTopicNo.6)  Re[2]: 【C#】StringCollectionについて【仕様?】
□投稿者/ 純@WAS (6回)-(2010/05/31(Mon) 10:37:11)
aetos様、エクシ様、よねKEN様

ご回答ありがとうございます。
参照型という存在そのものを忘れていました。
大体手法を考えて実装しなおしてみます。
解決済み
引用返信 編集キー/
■50212 / inTopicNo.7)  Re[3]: 【C#】StringCollectionについて【仕様?】
□投稿者/ 純@WAS (7回)-(2010/05/31(Mon) 10:39:09)
みきぬ様

入れ違いすいません。
環境を書き漏らしていました。2.0です。

なるほど…アドバイス頂いたListは何度か実装経験があるので、
それで試してみようと思います。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -