Сводка : если я создаю объект в инициализаторе конструктора, как мне сохранить ссылку на него, чтобы я мог ссылаться на него позже?
Подробнее :
У меня есть класс (LibBase
, ниже), который требует StreamWriter
в качестве параметра построения. У меня нет исходного кода для LibBase
- он находится в сторонней библиотеке.
public class LibBase
{
public LibBase(System.IO.StreamWriter wtr) { ... }
}
Я получил MyClass
из LibBase
, и в конструкторе MyClass
я хочу передать экземпляр 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))
{ }
}
Проблема в том, что MyWriter
требует удаления, поэтому MyClass
должен утилизировать его (и реализовать для этого IDisposable
) , но MyClass
не имеет ссылки на созданный экземпляр MyWriter
так что я не могу избавиться от него . Синтаксис инициализатора конструктора, похоже, не позволяет my сохранять ссылку.
Мое решение - перекодировать 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
}
Закрытый конструктор хранит ссылку на экземпляр MyWriter
, поэтому я могу его утилизировать позже.
Мои вопросы :
- Что мне здесь не хватает? Я чувствую, что я борюсь с языком. C # обеспечивает лучший способ сделать это?
- Если язык не поддерживает это напрямую, есть ли лучшее решение, чем мой метод частного конструктора?
- Есть ли какие-либо комментарии по поводу дефектов в моем решении?