让我们来看看臭名昭着的IDisposable接口:
[ComVisible(true)]
public interface IDisposable
{
void Dispose();
}
Run Code Online (Sandbox Code Playgroud)
和一个典型的实现,如MSDN所推荐的(我省略了检查当前对象是否已被处理):
public class Base : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// release managed
}
// release unmanaged
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Base()
{
Dispose(false);
}
}
public class Derived : Base
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
// release managed
}
// release unmanaged
disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:我认为这种实现是违反直觉的.它在基类和派生类中也有显着差异.派生类应该假设基类正确实现了IDisposable,然后重写Dispose(bool),它甚至不是原始接口的一部分.
我不得不承认,我想出了这个问题,因为我经常要求初级程序员在求职面试中实施IDisposable.如果他们不确切地知道应该怎么做,他们会想出一些接近这个的东西: …
是否可以使用任何标准序列化程序反序列化对象属性,而无需创建新对象?
问题是,有问题的对象非常复杂(它们只能由特殊工厂创建,它们的类型是在运行时动态生成的),但是它们有一些已知属性,我想将它们存储在外部文件中(最好是xml) ,但二进制也没问题),以后(可能在应用程序重启后),我希望将存储的属性设置回我提供的对象.
似乎所有标准序列化程序只能为我生成一个新对象(这也需要一个公共无参数构造函数),我必须从中手动分配所有属性.这与我希望避免的手动序列化没有太大区别,因为一组序列化属性非常大,并且在项目生命周期中可能会改变几次.在这一点上,我非常接近编写自己的轻量级序列化器,但也许有人可以提出更标准的方法来做这些事情?