Zan*_*oni 33 c# dispose idisposable using
我需要强制使用"使用"来处理类的新实例.
public class MyClass : IDisposable
{
...
}
using(MyClass obj = new MyClass()) // Force to use "using"
{
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 45
您需要确保处理对象的事实表明存在设计缺陷.如果处理是礼貌或有效的事情,这很好,但它不应该在语义上是必要的.
没有办法强制通过using语句处理对象.但是,您可以做的是在对象中维护一个标志,指示对象是否被处置,然后编写一个检查该标志的终结器.如果终结器检测到对象没有被丢弃,那么你可以使用终结器,例如,通过failfast终止进程.也就是说,严重惩罚那些忽略处置对象的用户,他们不得不修复他们的错误或停止使用你的对象.
这并不会让我感觉良好,善良或有礼貌,但你是唯一一个知道未能处置对象的可怕后果的人.是否对不遵守你的疯狂规则的人施加惩罚比对他们不遵守规则的后果生活更好是由你来决定的.
Dan*_*ant 21
这很难看,但你可以这样做:
public sealed class DisposableClass : IDisposable
{
private DisposableClass()
{
}
public void Dispose()
{
//Dispose...
}
public static void DoSomething(Action<DisposableClass> doSomething)
{
using (var disposable = new DisposableClass())
{
doSomething(disposable);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Tam*_*mas 13
您可以使用Roslyn框架编写自己的警告/错误.您DiagnosticAnalyzer将检查所有构造函数调用,以查看您的类是否正在构建,以及您是否在using语句中.
报告的诊断可以设置为"错误"严重性,并且可以标记为不可配置,这意味着没有人可以将其降级为警告或信息.
此外,如果您正在开发Nuget库,您可能希望将分析器作为开发依赖项发送,并将其添加为分析器nuget包.这将导致您的所有用户被迫处置您的给定类.这种包装称为"代码感知库".
请注意,理论上这可以通过第三方分析器库(例如FxCop)来完成,但是有许多IDisposable实现并不是严格需要处理的,例如MemoryStream,它们Dispose没有做很多,所以这些规则要么有一些白名单机制,要么报告误报.
using语句是编译器从以下转换的简写:
(using DisposableObject d = new DisposableObject()){}
Run Code Online (Sandbox Code Playgroud)
成:
DisposableObject d = new DisposableObject()
try
{
}
finally
{
if(d != null) d.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
所以你或多或少地会问是否可以强制编写一个调用Dispose for object的try/finally块.