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?
The way you are doing things now might make everyone happy but you as it wont work. You are returning a disposed
DirectorySearcherin yourSearcherproperty.I’d just do:
}
I don’t see whats wrong in using
try-catchblocks in constructors.I wouldn’t recommed the property initializer syntax when constructing
IDisposableobjects as you cannot dispose them normally if a property initialization throws.