2

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

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

例如)对于 Stamper.cs -> Stamper.cs + Stamper.Dispose.cs 其中Stamper.cs包含用于标记的实际逻辑,而Stamper.Dispose.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 实现。

此外,在源代码中的方法之间导航没有太大问题。第一个原因似乎不仅仅是在我的具体情况下坚持使用一个文件解决方案的原因。

4

8 回答 8

8

是的,太远了。只是在代码周围粘贴一个#Region 并将其折叠以使您看不到它有什么问题?

于 2009-02-10T20:38:48.927 回答
7

它似乎与为构造函数逻辑创建部分类一样任意。现在我必须查看两个文件来了解该类。部分课程只对设计师的东西真正值得......

于 2009-02-10T20:41:38.140 回答
6

我更愿意在同一个文件中看到处置逻辑作为保证实现 IDisposable 的资源。虽然存在主观性因素,但我认为这太过分了

于 2009-02-10T20:41:07.080 回答
2

我认为你的解决方案是不合理的。部分类通常应该只用于将开发人员代码与生成器代码分开。区域通常可以更好地为代码添加结构。

于 2009-02-10T20:41:52.943 回答
1

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

对于暴露事件、繁重的序列化方法以及在您的情况下的内存管理等样板来说,这可能是一个好习惯。

更喜欢部分类而不是轮廓(#region)。如果您必须使用部分类或代码大纲来使代码可读,这通常表明代码需要更改。如果代码对于维护该类是绝对必要的,则仅作为最后的手段使用部分类(或区域)。

在您的情况下,您可以使用一个简单地包装非托管资源并公开单个 Dispose 的类。然后在你的另一个类中,使用托管对象并在没有逻辑的情况下处理它。

如果您的类只是一个薄包装,那么我会说您的方法是矫枉过正,因为该类的全部目的是处置非托管资源。

于 2009-02-10T20:39:49.220 回答
0

有点奇怪的问题,因为它只对开发人员有影响,完全取决于个人喜好。我只能告诉你我更喜欢什么,如果处置部分中有大量逻辑,我会这样做。

于 2009-02-10T20:45:04.963 回答
0

就我个人而言,我尝试将我的实例化/初始化逻辑和我的清理/处置逻辑并排保持,这是一个很好的提醒。

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

于 2009-04-21T18:44:37.633 回答
0

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

在 vb.net 中,这种方法可能很好地允许在 IDisposable 对象中安全地一起处理字段声明、初始化和清理。需要适量的样板代码,但之后的字段声明非常干净。例如:

' 假设选项隐含在:
Dim MyThingie = RegDisposable(新 DisposableThingie)
' 如果未启用隐式:
将 MyThingie 调暗为 DisposableThingie = RegDisposable(New DisposableThingie)

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

不幸的是,在 C# 中没有干净的方法可以做任何类似的事情,因为字段初始化程序无法使用即将构造的对象(在 vb.net 中,字段初始化程序在构造基础对象之后运行)。

于 2011-01-16T23:44:10.333 回答