【发布时间】:2015-08-24 15:57:03
【问题描述】:
对我目前正在处理的 C# 对象类型有点困惑(也不确定)。
例如:
interface IMyInterface
{
IDictionary<string, ICustomPath> MyPathDictionary { get; }
}
由一个类实现,也实现了 IDisposable
class MyClass:IMyInterface,IDisposable
{
}
IMyInterface myInterface = new MyClass();
我知道如何处理对象 MyClass 的实例“myInterface”(通过 using 语句或显式将实例转换为 IDisposable 之类的
((IDisposable)myInterface).Dispose();
or
((MyClass)myInterface).Dispose(); in the finally block after I'm done with what I'm doing.
但是我有类似下面的代码行
IExampleInterface exampleInterface = some condition ? myInterface.MyPathDictionary[key]:myInterface.CreateSomething(key);
而 MyPathDictionary[key] 是一个字典值(其中键是字符串类型)和 IExampleInterface 类型的值,它由另一个名为 ExampleClass 的类实现,该类也实现 IDisposable 之类的。
class ExampleClass:IExampleInterface,IDisposable
{
}
现在我的困惑是由上述条件语句引起的,因为使用专有工具分析我的代码表明 myInterface.MyPathDictionary[key] 导致资源/内存泄漏。我不确定的是,当我在 C# 代码的 finally 块中显式处理 myInterface 时,我是否也应该显式处理 myInteface.MyPathDiciotnary[key] 因为如果我已经处理了 myInterface 然后调用MyPathDictionary[key] 上的 (myInterface) 应该会自动处理掉。
任何关于这个难题的建议将不胜感激。
【问题讨论】:
-
在这样的接口后面隐藏一个一次性类是很成问题的。该界面的用户不会知道他需要进行铸造体操来处理对象。而且永远不会。任何类型的静态代码分析器也很可能被彻底混淆,它无法将 Dispose() 调用连接到对象。您将不得不忽略该警告。通过从 IDisposable 继承您的接口,帮助客户端程序员陷入成功的陷阱。
-
你对体操的事情是绝对正确的,但这是一个旧的遗留 C# 代码,我们在 COM 对象上创建包装器并在类上实现 IDisposable,而不是直接继承接口本身。我应该无论如何都要更改旧代码。
-
对不起,这是我上面评论的最后一行的错字。我的意思是无论如何我都不应该更改遗留代码。