0

コンカレントディクショナリがあり、TryGetValueを試し、それが失敗するかどうかをテストする場合は、何かを行いますが、失敗しない場合、TryGetValue関数から取得される出力値は、TryGetValueを試す前の値と等しくなります。 、私は何か他のことをします。

私の質問は、(ConcurrentDicationaryの何もdefault(DateTime)に設定されないと仮定して)、2番目のifステートメントが実際に実行されるのでしょうか?それとも現在の状況を考えると不可能ですか?

var m_unitsWaitingForReadResponse = new ConcurrentDictionary<string, DateTime>();
DateTime outVal = default(DateTime);
if (!m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal))
{
    //Do Stuff
}
if (outVal == default(DateTime))
{
    //Do Stuff 2
}
4

3 に答える 3

2

指定されたキーの値がConcurrentDictionaryにない場合、2番目のifブロックは常に実行されます。

このURLの値のパラメータセクションをお読みください

ConcurrentDictionary.TryGetValueメソッド

于 2012-11-27T19:08:59.130 に答える
1

TryGetValue辞書に何も​​入れていないため、常にfalseが返されます。falseを返した後、最初のifブロックは実行されませんが、2番目のifブロックは実行されます。両方の場合、ブロックは実行されます。これoutValは、の値がであるためですdefault(DateTime)

ただし、ディクショナリにデータが含まれている場合は、にdefault(DateTime)渡すキーに関連付けられた値である可能性がありますTryGetValue。その場合、最初のifブロックは実行されませんが、2番目のifブロックは実行されます。

編集:

上記の最初の段落の元のバージョンは正しくありません。ifステートメントの否定(!)に注意してください。

if (!m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal))

その式はtrue、TryGetValueがを返すときに評価されますfalse。したがって、次の可能性がありますが、あなたの仮定では、可能性3はあなたの場合には当てはまりません。

  1. キーが辞書にありません
  2. ディクショナリ内のキーに関連付けられている値が次の値と等しくないdefault(DateTime)
  3. ディクショナリ内のキーに関連付けられている値は、default(DateTime)

最初のケースでは、TryGetValueはfalseを返します。Do Stuff実行します。outValに等しいdefault(DateTime); そしてDo Stuff 2実行します。

2番目のケースでは、TryGetValueはtrueを返します。Do Stuff実行されません。outValと等しくありませんdefault(DateTime); 実行されDo Stuff 2ません。

3番目の(不可能な)ケースでは、TryGetValueはtrueを返します。Do Stuff実行されません。outValに等しいdefault(DateTime); そしてDo Stuff 2実行します。

于 2012-11-27T19:07:46.903 に答える
1

MSDNのドキュメントには、キーが辞書に存在しない場合にTryGetValue返されると記載されています。default(TValue)そうです、実行する必要があります。

代わりに、次のように最初の句をTryGetValue使用するだけで、の戻り値をテストできます。elseif

m_unitsWaitingForReadResponse= new ConcurrentDictionary<string, DateTime>();

DateTime outVal = default(DateTime);

if (!(m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal)))
{
    //Do Stuff
}
else
{
    //Do Stuff 2
}

ConcurrentDictionaryここに表示されていないコードを使用して、オブジェクトにはある時点でデータが含まれると思います。

于 2012-11-27T21:12:02.840 に答える