Jon*_*ton 3 c# idisposable using
我喜欢using(){}语句来控制范围和可读性.您不仅可以创建对象,使用它们并巧妙地处理它们,还可以像这样使用它:
假设myInstance是代码中其他位置的MyClass实例 - 即方法参数或其他东西
using (var t = myInstance) {
t.Foo= "Hello";
t.Bar= "World";
...
}
Run Code Online (Sandbox Code Playgroud)
MyClass的定义:
public class MyClass : IDisposable
{
public string Foo {get; set;}
public string Bar {get; set;}
...
public void Dispose() {}
}
Run Code Online (Sandbox Code Playgroud)
这使得代码更整洁,更具可读性(我觉得),并且更容易输入.但是,为了广泛使用它,您必须实现IDisposable.在这种情况下,MyClass不需要在Dispose中实际处理任何内容,因此它是空的.
我的问题是,以这种方式使用IDisposable有什么缺点吗?
我很欣赏SO上已经存在类似的问题,但我不认为这些问题涉及为此目的使用IDispose(或者它们指的是特定的类).
编辑:
好的,所以我想我有点特别,但这里有更广泛的意义.using语句是一种方便,非常简洁的方法,可以在特定的时间长度内定义实例,然后您可以忘记它.将这种能力仅限于IDisposable对象似乎是不公平的.是的,不仅仅是实例化,然后设置为null,还有一定程度的懒惰,但是使用块使得它非常具体,实例的范围是什么.为什么我不应该被允许使用非IDisposable类?
如果您的课程不需要处理,那么使用就没有意义了using.
相反,你可以做一个正常的块:
{ var t = myInstance;
t.Foo= "Hello";
t.Bar= "World";
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到目的.
从设计角度来看,您不应该IDisposable不必要地实施.
实现IDisposable告诉使用您的类的人,它使用昂贵的资源,并在完成时必须处理.
如果这不是真的,那么你只是让他们的工作更加努力.
当您实施时,IDisposable您宣传您的课程是特殊的,需要妥善处理.不仅使用类似的内联代码,而且当类包含对您的类的引用时.他们还需要实现IDisposable以处理您的实例.这对您班级的用户产生了一种人为的要求.
您可以使用范围来实现您想要的效果:
{
var _ = instance;
_.Foo = "Hello";
_.Bar = "World";
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
instance.With(_ => {
_.Foo = "Hello";
_.Bar = "World";
});
...
public static class WithExtensions {
public static void With<T>(this T instance, Action<T> action) {
action(instance);
}
}
Run Code Online (Sandbox Code Playgroud)
这个更好,因为正在发生的事情是更明确的.
我也看到了你的痛苦.如果我们可以定义自己的控制块(比如在Nemerle中)会更好.虽然C#不允许这种自定义,但您不应滥用特定using语句来实现您想要的.您可以使用lambdas来实现这一点,这与我使用With扩展方法显示的方式非常相似.实际上,这就是在任务并行库中完成一些并行"构造"的方式.
| 归档时间: |
|
| 查看次数: |
2739 次 |
| 最近记录: |