そのため、WeakReferences を使用したコードがあります。私は一般的な.IsAlive
競合状態を知っているので、それを使用しませんでした。私は基本的に次のようなものを持っています:
WeakReference lastString=new WeakReference(null);
public override string ToString()
{
if(lastString!=null)
{
var s=lastString.Target as string; //error here
if(s!=null)
{
return s;
}
}
var str=base.ToString();
lastString=new WeakReference(str);
return str;
}
どういうわけか、マークされた行で null 参照例外が発生しています。デバッグすることで、null チェックでラップされ、lastString が実際には null に設定されていないにもかかわらず、lastString が実際に null であることを確認できます。
これは複雑なフローでのみ発生するため、ガベージ コレクションがターゲットだけでなく実際の WeakReference オブジェクトを何らかの形で取得していると思われます。
これがどのように起こっているのか、そして最善の行動方針は何かについて、誰かが私に教えてもらえますか?
編集:この原因をまったく特定できません。エラーコードをtry-catchでラップすることになりました。今のところ修正してください。しかし、私はこれの根本的な原因に非常に興味があります。これを単純なテスト ケースで再現しようと試みてきましたが、非常に難しいことが証明されています。また、これは単体テスト ランナーで実行している場合にのみ発生するようです。コードを最小限に抑えると、TestDriven と Gallio を使用して実行するとクラッシュし続けますが、コンソール アプリケーションに配置すると失敗しません。