2009-08-13 15 views
0

。クラスには4つの整数と1バイトが含まれます。整数の1つは、増分する必要があるカウンタを表します。ハッシュテーブルの.NET例外

ハッシュテーブルには1つの要素しかありません。鍵は"Tomo"です。私も、デバッガを使用しているが、私はハッシュテーブルは、そのインスタンスが含まれていることを見ることができます、null参照の例外を取得し、最後の行で

string strM = "Tomo" 
MarketPlace mkt = (MarketPlace)mHash[strM]; 
mkt.nCter++; 

私はこれを行います。このコードは1週間前にうまくいきました。 mktnullで、その場所で

mHash[strM] = mkt; 
mHash.Add(strM, mkt); 

+4

.NET 2.0を使用しています。なぜHashtableを使用していますか? 'Dictionary ' –

+0

なぜか? .NET 2.0ではHashTableを使用できません。 –

+2

.Net 1.1/1.0との下位互換性があります。あなたは本当にそれを使用しないでください。 –

答えて

2

では、次のを行う場所を探します。

編集:これは、Hashtableにキーが含まれていることを確認したという内容に基づいています。実際にHashtableはキーが含まれていなかった場合、以下が適用されます。

If the specified key is not found, attempting to get it returns null .

+0

これはヌルではないキーを含んでいます。それ以前の関数であっても、そのクラスのインスタンスを使用しています。 –

+0

もう一度チェックしてください - それはヌルのキーではなく、ヌルの値 'mkt'です。また、 'Market mkt =(Market)mHash [strM];'行にブレークポイントが設定されていても 'NullReferenceException'がスローされます。これはパズルの重要な情報です。 –

1

は、.NET 2.0を使用しているので、私が代わりにハッシュテーブルのDictionary<string, Market>を使用することをお勧めします。これは型の安全性を提供し、おそらくこの場合に問題が発生している理由を理解するのに役立ちます。

+0

キャストするタイプは何とか行われるので、このソリューションのメリットは何ですか?もっと説明できますか? –

+1

ボクシングは避けてください。ボクシングはあなたのような問題を引き起こす可能性があります。また、型の安全性も確保されています。コレクションに追加するコードと受信側のコードが同じように処理していることを確認します。あなたの場合は、おそらくヌル参照を追加するか、間違ったキーを追加するか、間違ったキーを使って取得するかのどちらかです。型の安全性を持つことで、このプロセスで最もよくある間違いをコンパイラがチェックできます。副次的な利点として、あなたはボクシングを避けるので、あなたはジェネリックスでより良いパフォーマンスを得るでしょう。 –

+0

これは、より読みやすく、コードをデバッグしやすくします。 (また、ランタイムは、オブジェクトが必要な型にキャストできることを事前に知っているので、チェックから節約できます) – Thorarin

0

値がnullのHashtableのキーだけではないのですか?例えば

、これは動作します:

mHash["Tomo"] = null; 
Market value = (Market)mHash["Tomo"]; 
value.nCounter++; // NullReferenceException 
+0

私はそれがクラスのインスタンスを含んでいると確信しています。 –

+0

あなたの前提の1つが間違っていなければなりません、またはあなたはこのエラーを得ていないでしょう:) – Thorarin

-1

はたぶん、あなたは後方にインスタンスを追加しました。

mHash.Add(instance, "Tomo") 

代わりの

mHash.Add("Tomo", instance) 

デバッガにあるとき、それがリストされていたかのようだから、それが表示されることがありますが、キーは、実際のインスタンスであり、「トモ」はオブジェクトの値です。

関連する問題