小编Chr*_*iso的帖子

为什么IDisposable实现的设计方式如此

让我们来看看臭名昭着的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.如果他们不确切地知道应该怎么做,他们会想出一些接近这个的东西: …

.net c#

12
推荐指数
2
解决办法
1656
查看次数

将属性反序列化为预先存在的对象

是否可以使用任何标准序列化程序反序列化对象属性,而无需创建新对象?

问题是,有问题的对象非常复杂(它们只能由特殊工厂创建,它们的类型是在运行时动态生成的),但是它们有一些已知属性,我想将它们存储在外部文件中(最好是xml) ,但二进制也没问题),以后(可能在应用程序重启后),我希望将存储的属性设置回我提供的对象.

似乎所有标准序列化程序只能为我生成一个新对象(这也需要一个公共无参数构造函数),我必须从中手动分配所有属性.这与我希望避免的手动序列化没有太大区别,因为一组序列化属性非常大,并且在项目生命周期中可能会改变几次.在这一点上,我非常接近编写自己的轻量级序列化器,但也许有人可以提出更标准的方法来做这些事情?

c# serialization

5
推荐指数
1
解决办法
2732
查看次数

标签 统计

c# ×2

.net ×1

serialization ×1