I've got the following setup:
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
}
}
}
The reason I use int.MaxValue is because in this case I know I'll exceed the defaults, but the number will never be ridiculously large, so I'm fine about that point.
But if I turn on Code Analysis and Microsoft Basic Correctness Rules it complains:
Warning 2 CA2000 : Microsoft.Reliability : In method 'SomeClass.SomeClass()', object '<>g_initLocal0' is not disposed along all exception paths. Call System.IDisposable.Dispose on object '<>g_initLocal0' before all references to it are out of scope.
It's problem is that PageSize and SizeLimit can throw exceptions, and if that happens the G__initLocal0
object doesn't get disposed (even if _searcher
does get disposed). The exception they can throw is if you assign them to a negative number, which can't happen here but it still complains.
Next I set the properties outside an object intitializer with regular assignment statements, but then ReSharper complains telling me that I should be using Initializer. I could suppress ReSharper, but I like to figure a way of getting things to work without adding suppressing.
So I figured I had to catch the error and I don't like catch errors in my constructors if possible, so I created a property called Searcher like this:
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;
}
}
Now Code Analysis and everything is happy, but I'm not happy with the solution at all.
Any hints?