存储对构造函数初始化程序中创建的对象的引用

And*_*son 4 c# constructor

简介:如果我在构造函数初始化器中创建一个对象,如何保留对它的引用,以便稍后引用它?

细节:

我有一个类(LibBase,下面)需要一个StreamWriter作为其构造参数.我没有源代码LibBase- 它在第三方库中.

public class LibBase
{
    public LibBase(System.IO.StreamWriter wtr) { ... }
}
Run Code Online (Sandbox Code Playgroud)

MyClass从构造函数中派生出来,LibBaseMyClass希望将MyWriter(派生形式StreamWriter)的实例传递给基类.我这样做如下.

public class MyWriter : System.IO.StreamWriter
{
    public MyWriter(int n) { ... }
    // Contains unmanaged resources
}

public class MyClass : LibBase
{
    public MyClass(int n)
    : LibBase(new MyWriter(n))
    { }
}
Run Code Online (Sandbox Code Playgroud)

问题是MyWriter需要处理,所以MyClass应该配置它(并实现IDisposable这样做)MyClass没有对创建的MyWriter实例的引用,所以我不能处理它.构造函数初始化程序的语法似乎不允许我保留引用.

我的解决方案是重新编码MyClass如下:

public class MyClass : LibBase, IDisposable
{
    public MyClass(Encoding enc)
    : this(new MyWriter(enc))
    { }

    private MyClass(MyWriter wtr)
    : LibBase(wtr)
    { this.wtr = wtr; }  // store reference

    private MyWriter wtr;

    // (implement IDisposable using wtr member variable
}
Run Code Online (Sandbox Code Playgroud)

私有构造函数存储对MyWriter实例的引用,以便稍后处理它.

我的问题:

  1. 我在这里错过了什么?我觉得我在和语言作斗争.C#是否提供了更好的方法?
  2. 如果语言不直接支持这个,那么有没有比我的私有构造函数更好的解决方案?
  3. 对我的解决方案中的缺陷有何评论?

Jon*_*eet 5

我不认为你在这里遗漏任何东西.你的解决方案看起来不错,如果 LibBase真的不让你得到你传递给构造函数的作者.

我怀疑没有更明确支持的原因是它不会经常出现.如果您发现它在设计中经常出现,那么您可能会过度使用继承.

引导埃里克利珀:

但是,正如我经常指出的那样,我没有必要提供不做功能的理由.功能不便宜; 它们非常昂贵,而且它们不仅要证明自己的成本是合理的,而且必须证明没有完成我们本可以用这个预算完成的其他一百个功能的机会成本.我们必须证明我们的利益相关者的功能成本合理,但我们不需要通过不实现不符合我们标准的功能来节省时间和精力.

我猜这是一个不符合标准的东西,即使它首先被认为是可取的.(C#团队的成本超出了成本 - C#开发人员承担了每个功能的精神成本,并且每个新功能的持续成本使得添加下一个功能变得更加困难.)