代码之家  ›  专栏  ›  技术社区  ›  dance2die

我应该将Dispose逻辑分离到一个分部类文件中吗?

  •  2
  • dance2die  · 技术社区  · 16 年前

    在重构一些C#类时,我遇到了实现IDisposable的类。

    我不假思索地为实现IDisposable接口的每个类创建了部分类文件。

    包含冲压的实际逻辑 和 邮票。处置cs 包含处置逻辑

    // Stamper.cs
    public partial class Stamper
    {
    // actual logic
    }
    
    // Stamper.Dispose.cs
    public partial class Stamper: IDisposable
    {
    // Implement IDisposable
    }
    

    当我查看代码时,Stamper.cs现在看起来更清晰易读(现在大约有52行,而不是100行,其中大约50行只是一个清理处理代码)

    *编辑 我遇到的问题是,在更新实际逻辑后,我实际上忘记了更新IDisposable实现。

    在我的具体案例中,第一个原因似乎足以让我坚持使用一个文件解决方案。

    8 回复  |  直到 16 年前
        1
  •  8
  •   StingyJack    16 年前

        2
  •  7
  •   Maurice Flanagan    16 年前

        3
  •  6
  •   Rowland Shaw    16 年前

        4
  •  2
  •   JohannesH    16 年前

        5
  •  1
  •   Coincoin    16 年前

    如果你的清理程序很重,这是可以接受的,但并不理想。

    一、 更喜欢

    在您的情况下,您可以使用一个类,该类对非托管资源进行精简包装,并公开一个单独的Handle。然后在另一个类中,使用托管对象,并在没有逻辑的情况下对其进行处理。

    如果你的类只是一个薄薄的包裹,那么我会说你的方法有点过头了,因为类的全部目的是处理非托管资源。

        6
  •  0
  •   Allen Rice 0x6A75616E    16 年前

        7
  •  0
  •   STW    16 年前

    就我个人而言,我尽量把实例化/初始化逻辑和清理/处置逻辑放在一起,这是一个很好的提醒。

    至于分部类,我使用它们的唯一一次是当一个类非常大并且可以分为多组方法时。隐藏设计器代码也很棒。

        8
  •  0
  •   supercat    14 年前

    我倾向于在有问题的代码是计算机生成的时候使用偏类。如果你有许多类共享类似的代码(由于各种原因,这些代码必须重复,而不是被拉到自己的类中),那么有一些模板和一个程序来基于这些模板生成代码可能会很有用。在这种情况下,模板将被视为源文件,然后生成的文件将作为中间对象代码。将模板生成的代码提取到分部类中似乎是完全合适的。

    ' Assuming Option Implicit on:
    Dim MyThingie = RegDisposable(New DisposableThingie)
    ' If Implicit wasn't on:
    Dim MyThingie As DisposableThingie = RegDisposable(New DisposableThingie)
    

    RegDisposable将是一个类成员,它将把新的DisposableThingie添加到类所持有的列表中。然后,类“处置例程”将处置列表中的所有项目。