を投げることができたときに、私は次のセットアップ持って廃棄:このケースでは、私は、私はデフォルトを超えるだろう知っているので、私はint.MaxValueを使う理由があるオブジェクト初期化子とプロパティは例外
public class SomeClass
{
private DirectoryEntry _root;
private DirectorySearcher _searcher;
public SomeClass()
{
_root = new DirectoryEntry("ldap://bla");
_searcher = new DirectorySearcher(_root)
{
PageSize = int.MaxValue,
SizeLimit = int.MaxValue
}
}
}
を、しかし、ナンバーワンは決して大規模ではないので、私はその点については大丈夫です。
しかし、私はコード分析とMicrosoftの基本的な正しさのルールを、それは文句をオンにした場合:
警告2 CA2000:Microsoft.Reliability:メソッド 'においてSomeClass.SomeClass()'、オブジェクトの<を> g_ initLocal0 'はすべての例外パスに沿って配置されていません。オブジェクトへの参照がすべて範囲外になる前に、オブジェクト '<> g _initLocal0'にSystem.IDisposable.Disposeを呼び出します。
それは問題だががPageSizeとSIZELIMITが例外を投げることができるということであり、それはG__initLocal0
オブジェクトを発生した場合(_searcher
が配置されますない場合でも)に配置されません。これらの例外は、負の数に代入すると例外になりますが、これはここでは起こり得ませんが、それでも文句はあります。
次の例では、オブジェクトインティシアターの外にあるプロパティを通常の割り当てステートメントで設定していますが、ReSharperはInitializerを使用しているはずだと訴えています。私はReSharperを抑制することができましたが、私は抑圧を加えずに仕事を得る方法を見つけ出すのが好きです。
だから私は、私はエラーをキャッチしなければならなかった考え出し、可能ならば、私は私のコンストラクタでキャッチエラーを好きではないので、私はこのようなサーチャーと呼ばれるプロパティを作成:
private DirectorySearcher _searcher;
public DirectorySearcher Searcher
{
get
{
if (_searcher != null) return _searcher;
var searcher = new DirectorySearcher();
try
{
searcher.PageSize = int.MaxValue;
searcher.SizeLimit = int.MaxValue;
_searcher = searcher;
}
catch
{
searcher.PageSize = 1000;
searcher.SizeLimit = 1000;
}
finally
{
searcher.Dispose();
}
return _searcher;
}
}
今コード分析し、すべてがあります幸せですが、私は解決策に全く満足していません。
ヒント
あなたのプロパティは、現時点で廃棄された 'DirectorySearcher'を返すでしょう... –
" ...私は私のコンストラクタでキャッチエラーが好きではありません "。何故ですか?あなたは今何をやっているより受け入れられるようです。 –
'SomeClass'は' IDisposable'を実装し、そこにクリーンアップする必要があります。 –