2016-11-25 2 views
0

У меня есть объект настроек для отчетов, в котором есть несколько шрифтов.Должен ли я использовать старый шрифт в настройщике свойства шрифта?

Они дефолт как этот

public Font TitleFont { get; set; } = new Font("Arial", 8, FontStyle.Bold); 

но они могут переодеться в многочисленных местах, прежде чем использовать для GDI + рендеринга отчетов. Это не в элементе управления winForms.

Шрифты реализовать IDisposable, поэтому я должен избавиться от старого шрифта в установщике для свойства? Или я должен хранить имя, размер и стиль шрифта как 3 свойства и создавать шрифт только тогда, когда это необходимо?

+0

Возможный дубликат [Следует ли использовать старый шрифт при изменении шрифта элемента управления?] (Http://stackoverflow.com/questions/29103522/should-i-dispose-of-the-old-font-when- change-the-font-of-a-control) – Jens

+0

@Jens Я не думаю, что это дубликат, по крайней мере, не тот. Это не контроль winforms, и мой объект несет ответственность за шрифт – dibs487

+0

Если он «несет ответственность за шрифт», он должен «Dispose» его. В случае, если он просто использует его (например, если вы разработали вспомогательный класс или обычную программу), он не должен –

ответ

0

Главный вопрос: если класс отвечает за шрифт. Когда да, он должен 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; 
Смежные вопросы