c# - 管理类之间的共享资源?

标签 c# .net resources lazy-loading

想象一下,我有几个用于显示文本的查看器组件,它们几乎没有用户可以切换的模式(用于查看文本/二进制/十六进制的不同字体预设)。 管理共享对象的最佳方法是什么——例如字体、查找对话框等?我认为带有延迟初始化对象的静态类是可以的,但这可能是错误的想法。

static class ViewerStatic
{
    private static Font monospaceFont;
    public static Font MonospaceFont
    {
        get
        {
            if (monospaceFont == null)
                //TODO read font settings from configuration
                monospaceFont = new Font(FontFamily.GenericMonospace, 9, FontStyle.Bold);
            return monospaceFont;
        }
    }

    private static Font sansFont;
    public static Font SansFont
    {
        get
        {
            if (sansFont == null)
                //TODO read font settings from configuration
                sansFont = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold);
            return sansFont;
        }
    }
}

最佳答案

对于您希望创建一次然后重复使用的项目,有两种相关模式:Singleton 和 Cache。如果您将永远重复使用该项目,那么单例就可以了。分配给该实例的内存永远不会被清除。如果您将重复使用该项目一段时间,但可能几天都不会使用该功能,我建议使用缓存。然后当项目不再使用时可以清除内存。

如果您正在使用单例,您可能只想直接初始化字体而不是使用惰性初始化模式。对我来说,字体听起来很简单而且不太可能出错。但是,如果该项目可能在构造过程中失败(可能是由于缺少字体文件或其他原因),那么惰性模式至少允许它在下次重试。如果不重新启动整个应用程序,即使它失败了,您也无法稍后重做静态初始化程序。小心限制这些重试!

最后,您的类“ViewerStatic”的名称引起了关注。有一种称为“上帝”对象的反模式。我称之为“桶”。如果你创造它,东西就会来。你很快就会发现各种各样的东西被倾倒在桶里。您的 ViewerStatic 类将变得巨大。最好有一个名为“FontFlyWeights”的类,然后再有一个名为“ConstantStrings”或“SystemDialogFactory”的类......等等。

关于c# - 管理类之间的共享资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501950/

相关文章:

c# - 带有基于日期的子点的 WPF ItemsControl

c# - 属性的自定义异常 - 如何在符合 CA 规则的同时确保属性不为空?

c# - 仅当线程处于某个方法时才锁定多个方法

android - 效率、资源——将所有数据存储在一个或多个ArrayList中

delphi - 如何使用外部字体?

javascript - 从 JavaScript 运行 WScript.Shell.Run() 时获取 "Wrong number of arguments or invalid property assignment"

c# - 事件查看器 — 记录到子文件夹?

c# - Javascript 中的日期选择器和时间选择器条件

c# - Automapper 复杂类型映射异常

android - 如何从图标包加载图标