- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不喜欢样板代码:复制粘贴重用可能容易出错。即使您使用代码片段或智能模板,也不能保证其他开发人员做到了,这意味着不能保证他们做对了。而且,如果您必须查看代码,则必须理解和/或维护它。
我想从社区了解的是:我对类层次结构的 IDispose 的实现是否是 "traditional" dispose pattern 的合法替代方案? ?我所说的合法是指正确、性能合理、健壮且可维护。
我可以接受这个替代方案是完全错误的,但如果是这样,我想知道为什么。
此实现假定您可以完全控制类层次结构;如果你不这样做,你可能不得不求助于样板代码。对 Add*() 的调用通常在构造函数中进行。
public abstract class DisposableObject : IDisposable
{
protected DisposableObject()
{}
protected DisposableObject(Action managedDisposer)
{
AddDisposers(managedDisposer, null);
}
protected DisposableObject(Action managedDisposer, Action unmanagedDisposer)
{
AddDisposers(managedDisposer, unmanagedDisposer);
}
public bool IsDisposed
{
get { return disposeIndex == -1; }
}
public void CheckDisposed()
{
if (IsDisposed)
throw new ObjectDisposedException("This instance is disposed.");
}
protected void AddDisposers(Action managedDisposer, Action unmanagedDisposer)
{
managedDisposers.Add(managedDisposer);
unmanagedDisposers.Add(unmanagedDisposer);
disposeIndex++;
}
protected void AddManagedDisposer(Action managedDisposer)
{
AddDisposers(managedDisposer, null);
}
protected void AddUnmanagedDisposer(Action unmanagedDisposer)
{
AddDisposers(null, unmanagedDisposer);
}
public void Dispose()
{
if (disposeIndex != -1)
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
~DisposableObject()
{
if (disposeIndex != -1)
Dispose(false);
}
private void Dispose(bool disposing)
{
for (; disposeIndex != -1; --disposeIndex)
{
if (disposing)
if (managedDisposers[disposeIndex] != null)
managedDisposers[disposeIndex]();
if (unmanagedDisposers[disposeIndex] != null)
unmanagedDisposers[disposeIndex]();
}
}
private readonly IList<Action> managedDisposers = new List<Action>();
private readonly IList<Action> unmanagedDisposers = new List<Action>();
private int disposeIndex = -1;
}
从某种意义上说,这是一个“完整”的实现,我提供了对终结器的支持(知道大多数实现不需要终结器),检查对象是否被释放等。真正的实现可能会删除终结器,例如,或者创建包含终结器的 DisposableObject 的子类。基本上,我为这个问题投入了所有我能想到的东西。
我可能错过了一些边缘案例和深奥的情况,所以我邀请任何人在这种方法中找出漏洞或通过更正来支持它。
其他替代方案可能是在 DisposableObject 中使用单个 Queue
最佳答案
您可能遇到的第一个问题是 C# 只允许您从单个基类继承,在这种情况下,基类将始终 DisposableObject
。就在这里,您通过强制添加额外的层使您的类层次结构变得困惑,以便需要从 DisposableObject
和其他一些对象继承的类可以这样做。
在此实现过程中,您还引入了很多开销和维护问题(更不用说每次新人加入项目时的重复培训成本,您必须解释他们应该如何使用此实现而不是定义的模式)。您知道有多个状态可以跟踪您的两个列表,对操作的调用没有错误处理,调用操作时的语法看起来“很奇怪”(虽然从数组调用方法可能很常见,简单地将 () 放在数组访问之后的语法看起来很奇怪。
我理解减少必须编写的样板文件数量的愿望,但可处置性通常不是我建议走捷径或以其他方式偏离模式的领域之一。我通常得到的最接近的方法是使用一个辅助方法(或扩展方法)来包装对给定对象的 Dispose()
的实际调用。这些调用通常如下所示:
if (someObject != null)
{
someObject.Dispose();
}
这可以使用辅助方法进行简化,但请记住,FxCop(或检查正确处置实现的任何其他静态分析工具)会报错。
就性能而言,请记住您正在使用此类实现进行大量委托(delegate)调用。就委托(delegate)的性质而言,这比普通方法调用的成本要高一些。
可维护性在这里绝对是一个问题。正如我提到的,每次有新人加入项目时,您都会承担重复培训成本,并且您必须解释他们应该如何使用此实现而不是定义的模式。不仅如此,每个人都记得将他们的一次性元素添加到您的列表中,您会遇到问题。
总的来说,我认为这样做是个坏主意,会导致很多问题,尤其是随着项目和团队规模的增加。
关于c# - 这是类层次结构的 "traditional"处置模式的合法替代方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397196/
(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题: Macro that accept new object ...请记住这一点!) 这是一个人为的类: class foo
所以我尝试用java编写一个井字棋游戏。大部分已经完成,但是,如果有人选择了已被占用的空间,我无法返回无效的移动。 这是我试图弄清楚的代码。我认为由于空间是由数字 0 表示的(我的教授告诉我们这一点)
我想使用 Java 代码获取某些 Google 搜索引擎查询(在整个网络上)的估计结果数。 我每天只需要做很少的查询,所以一开始 Google Web Search API ,虽然已被弃用,但似乎已经
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
在 C++ 中,动态内存(取消)分配(malloc-free/new-delete)显然可以重复获得相同的内存范围,该内存范围被释放并按顺序再次分配。在多线程 C++ 中,这可能发生在多个线程中。 显
AesCryptoServiceProvider.LegalKeySizes 字段显示允许的位大小。 但是我不明白的是,如果这些都是真的,我如何才能成功利用 2048 位 key 长度(256 字节)
我有一个结构: typedef struct _n { int type; union { char *s; int i; }; } n; 当我
这个问题在这里已经有了答案: 关闭10年前. Possible Duplicate: int var = 1; void main() { int i = i; } 以下代码在g++和Visual C
根据 C++03 标准 (5.3.4/7): When the value of the expression in a direct-new-declarator is zero, the allo
我正在尝试创建一个生成器,使用 scalacheck 1.6.6 和规范 1.7 (scala 2.8.1) 生成(非零长度)合法的 unicode 字符串。 我希望我可以创建像这样的生成器: obj
这确实是一个关于 C++ 的问题,而不是 OpenGL。我正在关注 this OpenGL 教程(我刚开始),作者使用 C++(不是 C)。我的问题是 glVertexAttribPointer ta
由于 C++ 别名规则,您不能随意将 (一个 int*) 指向 char 数组,这似乎达成了一些共识。 从另一个问题——Generic char[] based storage and avoidin
我正在寻找一个通过 HTTP 接口(interface)发送文本消息的 SMS 网关。 但是,有些短信网关不允许设置发件人ID,允许的要么要求用户证明发件人ID是自己的手机号码,要么手动检查每个发件人
我们注意到您的应用要求用户注册个人信息才能访问非基于帐户的功能。在允许访问与用户无关的应用内容和功能之前,应用不能要求用户注册。 我们在注册时采用电子邮件 ID,因为所有数据都代表电子邮件 ID 在后
我一直在阅读 Bloch 和 Gafter 的 Java Puzzlers,并读到了第 10 个谜题 (Tweedledee)。这个谜题的本质是 provide declarations for th
这个问题确实符合标题:我很想知道造成这种差异的技术原因是什么,以及基本原理? std::shared_ptr sharedToVoid; // legal; std::unique_ptr uniqu
我试图做的是将数据框数据附加到现有的合法 excel 文件中。我使用了 openpyxl 中的 load_workbook() 函数,但它系统地返回了一个错误。这是一些在我的机器上崩溃的代码: fro
App 多次被 Apple 拒绝 “经过进一步审查,我们仍然发现您的应用使用了后台定位服务,但并未按照 iOS 人机界面指南的要求在位置模式警报中阐明其使用目的。” 在“NSLocationAlway
据我所知,像这样在 C++ 中实例化一个整数是合法的: int x = int(5); 作为一名 Java 程序员,我会假设这行代码调用传递“5”作为参数的整数的构造函数。我读到 int 不是一个类,
我是一名优秀的程序员,十分优秀!