- PR -

C# HashtableでAddした要素内の変更は不可でしょうか

1
投稿者投稿内容
katudon
会議室デビュー日: 2007/04/26
投稿数: 13
投稿日時: 2007-04-26 18:44
教えていただけますか?
HashTableで構造体をAddしています。
// 構造体の定義
public struct ArrayStruct
{
public string Key; // senderのToString()
public int HashCode; // senderのToString().GetHashCode()
public object mArray;
}
// HashTableの定義
HashTable mKeys = new HashTable();

// 操作用関数
public virtual void Add (string inKey, object inValue){
ArrayStruct wArrayStruct = new ArrayStruct();
wArrayStruct.Key = inKey;
wArrayStruct.HashCode = inKey.GetHashCode();
wArrayStruct.mArray = inValue;
this.mKeys.Add(inKey.GetHashCode(), wArrayStruct);
// GetHashCodeは、inKeyのハッシュ値を取得しています
}


その後、下記の関数で構造体の中のmArrayを変更しようとしております。


// inHashCodeは上記のinKeyのHash値と同様とお考えください。
protected void SetWithHashCode(int inHashCode, object value) {
ArrayStruct wArrayStruct = (ArrayStruct)mKeys[inHashCode];
wArrayStruct.mArray = value;
}


ところが、wArrayStruct内は変更されますが、HashTableのmKeys内のデータは変更されません。たぶん簡単なセオリーを見落としていると思います。
初歩的なご指摘になりそうですが、どなたか指針をいただければと思います。
現在は、SetWithHashCodeで削除して新規追加しかないのかなと、思っております。
ご指摘よろしくお願いします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-04-26 19:04
構造体は値型です。つまり、HashTableに入れた段階でボックス化されています。
SetWithHashCode()の一行目で、Object型をArrayStruct型に型変換した時にボックス化が解除され、HashTableに入っているオブジェクトと別のオブジェクトがメモリ上に生成されます。
その別のオブジェクトのmArrayの参照先を変えたところで、HashTableに入っているオブジェクトのmArrayは変わりません。
ArrayStructをstructureではなくclassにしてみてください。


太字になっている部分はキーワードです。調べてみてください。

[ メッセージ編集済み 編集者: 一郎 編集日時 2007-04-26 19:06 ]
katudon
会議室デビュー日: 2007/04/26
投稿数: 13
投稿日時: 2007-04-26 19:16
一郎様ありがとうございます。
classに変更し、確認いたしました。
ボックス化調べました。ありがとうございます。
1

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