c# – 出于可读性的原因,使用空Dispose实现IDisposable

c# – 出于可读性的原因,使用空Dispose实现IDisposable,第1张

概述我喜欢using(){}语句来控制范围和可读性.您不仅可以创建对象,使用它们并巧妙地处理它们,还可以像这样使用它: 假设myInstance是代码中其他位置的MyClass实例 – 即方法参数或其他东西 using (var t = myInstance) { t.Foo= "Hello"; t.Bar= "World"; ...} MyClass的定义: public 我喜欢using(){}语句来控制范围和可读性.您不仅可以创建对象,使用它们并巧妙地处理它们,还可以像这样使用它:

假设myInstance是代码中其他位置的MyClass实例 – 即方法参数或其他东西

using (var t = myInstance) {    t.Foo= "Hello";    t.bar= "World";    ...}

MyClass的定义:

public class MyClass : Idisposable{   public string Foo {get; set;}   public string bar {get; set;}   ...   public voID dispose() {}}

这使得代码更整洁,更具可读性(我觉得),并且更容易输入.但是,为了广泛使用它,您必须实现Idisposable.在这种情况下,MyClass不需要在dispose中实际处理任何内容,因此它是空的.

我的问题是,以这种方式使用Idisposable有什么缺点吗?

我很欣赏SO上已经存在类似的问题,但我认为这些问题并不是为了这个目的而使用Idispose(或者它们是指特定的类).

编辑:

好的,所以我想我有点特别,但这里有更广泛的意义. using语句是一种方便,非常简洁的方法,可以在特定的时间长度内定义实例,然后您可以忘记它.将这种能力仅限于Idisposable对象似乎是不公平的.是的,不仅仅是实例化,然后设置为null,还有一定程度的懒惰,但是使用块使得它非常具体,实例的范围是什么.为什么我不应该被允许使用非Idisposable类?

解决方法 当您实施Idisposable时,您宣传您的课程是特殊的,需要妥善处理.不仅使用类似的内联代码,而且当类包含对您的类的引用时.他们还需要实现Idisposable才能处理您的实例.这对您班级的用户产生了一种人为的要求.

您可以使用范围来实现您想要的效果:

{  var _ = instance;  _.Foo = "Hello";   _.bar = "World"; }

另一种选择是:

instance.With(_ => {  _.Foo = "Hello";  _.bar = "World"; });...public static class WithExtensions {  public static voID With<T>(this T instance,Action<T> action) {    action(instance);  }}

这个更好,因为正在发生的事情是更明确的.

我也看到了你的痛苦.如果我们可以定义自己的控制块(比如Nemerle)会更好.虽然C#不允许这种自定义,但您不应滥用特定的using语句来实现您想要的.你可以使用lambdas来做到这一点,就像我用With扩展方法显示的那样.事实上,这就是Task Parallel Library中一些并行“构造”的完成方式.

总结

以上是内存溢出为你收集整理的c# – 出于可读性的原因,使用空Dispose实现IDisposable全部内容,希望文章能够帮你解决c# – 出于可读性的原因,使用空Dispose实现IDisposable所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存