【问题标题】:Method dispose functionality C#方法处置功能 C#
【发布时间】:2023-03-04 22:21:01
【问题描述】:

有没有办法在 C# 2010 (.Net 4) 中不使用 try-finally 块来处理方法变量?

故事: 我有很少的文件处理程序方法。每个处理程序(方法)都可以在执行过程中中止。 我喜欢在退出方法之前处理所有方法的对象。 为每个处理程序编写 dispose 方法的选项不是一个选项。

谢谢

这展示了总体思路: `公共静态类比较 { 私有静态 bool CompareXmls(...) { //根据4个条件,在3个出口点有7个对象要放置

        //General method flow:

        //1. init part of the object

        //2. if(!<condition1>)
                //disposed objects
                //exit method

        //3. perform some actions

        //4. init some of the other objects

        //2. if(!<condition2>)
                //disposed objects
                //exit method

        //and so on...
    }

    private static bool CompareJpgs(...)
    {
        //has 12 object to be disposed in 10 exit points acordding to 4 conditions
    }

    private static bool CompareBitMaps(...)
    {
        //has 5 object to be disposed in 3 exit points acordding to 4 conditions
    }

    private static bool CompareTxts(...)
    {
        //has 12 object to be disposed in 10 exit points acordding to 4 conditions
    }
}`

我还有另外 7 种比较方法

【问题讨论】:

  • 为什么不能选择?
  • 请提供一个示例,它是你所说的方法的类吗?
  • 如果你能把一些代码放在这里会很好,否则有太多方法可以抽象出处理句柄......是的,你必须创建一些抽象来这样做,它不会自动完成
  • “中止”是什么意思?
  • Oded - 这不是一个选项,因为我有太多方法,每个方法都有完全不同的对象。

标签: c# dispose filestream


【解决方案1】:

using?有关如何以及为什么使用http://msdn.microsoft.com/en-us/library/yh598w02(v=VS.100).aspx 的完整说明,请参阅此处。一个样本将是

using (MyDisposableType disposable1 = GetDisposable1(), disposable2 = GetDisposable2() /*,...*/)
{
    //your actions
}

退出using 块后,所有在其标头中声明的一次性对象都将被释放。

如果你的一次性物品类型不同,可以使用嵌套usings:

using (MyDisposableType1 disposable1 = GetDisposable1())
{
    using (MyDisposableType2 disposable2 = GetDisposable2())
    {
        //more usings if needed, and then your actions
    }
}

【讨论】:

  • 更正,所有 IDisposable 实现对象都将调用其 .Dispose() 方法。在其他情况下非常有用,而不仅仅是资源释放。 =)
  • 对,更准确:)
  • 但是非 IDisposable 对象呢?
  • 尽可能让他们IDisposable。如果没有,请将它们收集到IDisposable 类中,该类将这些对象放置在Dispose 中,并在您的方法中使用这个新类。您可能会想出一个或少量这样的类来满足您所有不同方法的需求。
  • 一般来说,处置不是IDisposable 的东西是什么意思?一个规则是,如果一个类的对象在销毁时需要额外的清理(GC 作业是不够的),那么该类应该实现IDisposable。你的问题让我觉得这个规则在你的设计中被打破了。微软和可靠的第三方库不违反这条规则,所以我想你可以控制你的类,因此可以将它们设为IDisposable
【解决方案2】:

我会将该方法放在一个暗示idisposible 的对象上,并在 finally 块中调用 this.dispose()

【讨论】:

  • 我不想使用 try-finally 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2020-08-10
  • 2022-10-23
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多