English 中文(简体)
D. 班子导弹问题
原标题:Class Destructor Problem

我正在做一个简单的班子,其中包括一部精炼钢板。

    class Logger
{
    private StreamWriter sw;
    private DateTime LastTime; 
    public Logger(string filename)
    {
        LastTime = DateTime.Now;
        sw = new StreamWriter(filename);
    }
    public void Write(string s)
    {
        sw.WriteLine((DateTime.Now-LastTime).Ticks/10000+":"+ s);
        LastTime = DateTime.Now;
    }
    public void Flush()
    {
        sw.Flush();
    }
    ~Logger()
    {
        sw.Close();//Raises Exception!
    }
}

但是,当我结束这名骑自行车的人时,这提出了一个例外,即已经删除了该推器?

Why? And how to make it work such that when the Logger class is deleted, the StreamWriter is closed before deletion?

感谢!

最佳回答

在99.99%的案例中,撰写你自己的主子(ka finalr)是错误的。 他们需要确保课堂释放一个运行系统资源,这种资源是自动管理的。 NET 框架和贵阶层用户适当发放的 was。

首先,必须首先在你自己的法典中分配操作系统资源。 这始终需要某种P/Invoke。 这是 极少需要的,是......的工作。 NET方案人员在微软公司工作以照顾这种情况。

他们在GerWriter案中这样做。 通过几个层次,它是一个由创建基金会创建的档案处理器的包裹。 创建该行业的班级也是负责撰写定稿人的班级。 微软代码,而不是你的代码。

这样的班级总是执行。 可以识别,使该类使用者有机会在资源投入使用时释放资源,而不是等待定稿者完成这项工作。 流放器可操作。

当然,你的精彩物体是贵国类别的一个私人执行细节。 您不知道用户与您做什么。 夸夸大类,你不能说是流利。 处置自动发生。 你们需要帮助。

提供这种帮助,实施可转让的生态。 您的班子的使用者现在可以称为放弃或使用发言,就像她对框架的任何类别一样:

  class Logger : IDisposable {
    private StreamWriter sw;
    public void Dispose() {
      sw.Dispose();   // Or sw.Close(), same thing
    }
    // etc...
  }

确实,这符合你在所有案件中的99.9%。 但并非在此。 冒着严重混淆你的风险:如果你执行可变的身份证,那么本类使用者还必须有合理的机会,可以称之为其处置方法。 这个问题通常不是很多,只有夸大类。 很显然,您的使用者希望达到最后可能的时刻。 因此,她可以脱离AppDomain的一个未经处理的例外。 未经处理 例如,例外。

在这种情况下,什么时候叫“处置”? 如果你的方案终止,你可以这样做。 但是,除了这一点外,如果在方案退出时,提前释放资源就没有什么意义。

伐木特别要求在所有情况下都适当关闭。 这就要求你确定精简者。 AutoFlush房地产是真实的,因此,伐木产出一经写,就会变。 鉴于很难适当要求处置,因此,现在实际上最好不要执行可转让的识别资料,让Microsoft的最后定稿者结束档案处理。

Fwiw,在存在同样问题的框架内,还有另一类。 校对班使用4个操作系统,但可操作。 要求Thread.Dispose() 是really awkward,因此Microsoft don t 执行。 这在 每<>一次>不寻常的案例中造成了问题,因此,你需要起草一个方案,创造许多深层的镜子,但从来不使用新操作者制造阶级物体。 这样做了。

最后,但并非最不重要的是:如上所述,撰写记录单相当trick。 Log4net是一个受欢迎的解决办法。 国家行车监督记录仪是一种更好的调制器,这是一个感知和工作的图书馆,而不是像 Java港那样。

问题回答

司机(a.k.a. Finalizers)不能按特定命令行事。 见。 文件:

两个物体的最后定稿者,即使一个物体提到另一个物体,也不受任何具体命令的约束。 也就是说,如果目标A提到目标B,而且双方都有定稿者,则目标B在目标A的最后定稿者开始时可能已经定稿。

IDisposable

作为一项一般规则,在涉及执行最终执行者时,没有。 通常,只有在你的班子直接使用未经管理的记忆时,才需要他们。 如果你执行最终决定,它就永远不应提及该类中任何有管理的成员,因为他们可能不再有效。

作为另外的告诫,我们知道,最终目标者是自己read子的,如果你重新使用已经亲近的未经管理的产品,他们可以走。 这些假想更清洁,可以识别和清冰,有序清理。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...