Главный вопрос: если класс отвечает за шрифт. Когда да, он должен Dispose
шрифт:
public class MyFontStorage: IDisposable {
private Font m_MyFont;
...
public Font MyFont {
get {
return m_MyFont;
}
set {
if (m_MyFont == value)
return;
if (m_MyFont != null)
m_MyFont.Dispose();
m_MyFont = value;
}
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
MyFont = null;
}
}
public void Dispose() {
Dispose(this);
GC.SuppressFinalize(this);
}
}
....
using (MyFontStorage storage = new MyFontStorage()) {
...
// Storage is responsible for the font
storage.MyFont = new Font(...);
...
// Control has responsibility for the font as well, that's why
// we have to create a copy in order to each font instance has one owner
MyControl.Font = new Font(MyFontStorage.MyFont, MyFontStorage.Font.Style);
...
}
Создание копии вместо того, чтобы просто назначая это плохая практика (склонным к ошибкам), и это почему вы можете захотеть реализовать завод -
"я должен хранить Fontname, размер и стиль"
public class MyFontFactory {
private string m_FamilyName;
private float m_Size;
private FontStyle m_Style;
...
public MyFontFactory(Font propotype) {
...
m_FamilyName = propotype.FontFamily.Name;
m_Size = propotype.Size;
m_Style = propotype.Style;
}
public Font CreateFont() {
return new Font(m_FamilyName, m_Size, m_Style);
}
}
....
MyFontFactory factory = new factory(SomeControl.Font);
...
// Much more natural:
// MyFontFactory creates a new font and MyControl takes responsibility for it
MyControl.Font = factory.CreateFont();
Наконец, в случае вспомогательный класс/полезности/рутинного и т.д.
public class MyFontMisc {
private Font m_MyFont;
public Font MyFont {
get {
return m_MyFont;
}
set {
m_MyFont = value;
}
}
// Just some computations
public float EmSizeInMillimeters {
get {
if (null == m_MyFont)
return 0.0;
...
}
}
}
...
// MyFontMisc doesn't hold any responsibility for the font
MyFontMisc misc = new MyFontMisc(SomeControl.Font);
// MyFontMisc just uses font for some computation and doesn't take
// any responsibility for the font (which owns to SomeControl)
Length = misc.EmSizeInMillimeters * 3.0f + 15.0f;
Возможный дубликат [Следует ли использовать старый шрифт при изменении шрифта элемента управления?] (Http://stackoverflow.com/questions/29103522/should-i-dispose-of-the-old-font-when- change-the-font-of-a-control) – Jens
@Jens Я не думаю, что это дубликат, по крайней мере, не тот. Это не контроль winforms, и мой объект несет ответственность за шрифт – dibs487
Если он «несет ответственность за шрифт», он должен «Dispose» его. В случае, если он просто использует его (например, если вы разработали вспомогательный класс или обычную программу), он не должен –