c# - 这个类最好的设计是什么?

标签 c# .net static class-design instance

假设这个类:

public class Logger
{
    static TextWriter fs = null;

    public Logger(string path)
    {
        fs = File.CreateText(path);
    }

    public static void Log(Exception ex)
    {
        ///do logging
    }

    public static void Log(string text)
    {
        ///do logging
    }
}

我必须像这样使用它:

Logger log = new Logger(path);

然后使用 Logger.Log() 记录我想要的内容。我只使用一个记录器。 问题是:这是一个好的设计吗?实例化一个类然后总是调用它的静态方法?任何更好设计的建议都会受到赞赏。

根据 Marc 编辑的回答:

我在 Log 的最后一行刷新,打开文件时我不需要读取文件,文件未完全关闭的问题是正确的。这个类只是满足我的要求,不需要线程安全。我只想读一下实例化部分,我应该进入你说的 SetPath,有关闭文件的建议吗?

最佳答案

是的,只为此使用构造函数是糟糕的设计。可以仅调用一次(否则抛出异常)的静态SetPath 方法似乎更好。您可以在应用程序启动等期间设置路径。

然后你可以让它成为一个static class,或者如果它需要满足一些基于接口(interface)的场景需要一个单例。

接下来:您必须在此处添加同步!那不是线程安全的。如果两个线程同时尝试记录,我希望这会崩溃。它不需要很复杂;最简单的:

private readonly object syncLock = new object();
public static void Log(string value) {
    lock(syncLock) {
        //...
    }
}

(但请注意,这可能会产生一些阻塞成本;这可以通过更复杂的代码进行改进 - 见下文)

现有的日志库会考虑更多问题——文件分区、异步(以阻止您的代码被 IO 阻塞)、批处理等;为什么不只使用其中一个呢?特别是,此时您的文件不会在应用程序退出时完全关闭,不会定期刷新,并且大部分时间都会保持文件锁定。不好。

关于c# - 这个类最好的设计是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638747/

相关文章:

c# - 如何在不同的控件中显示列表框选定项的属性

javascript - 如何从 C# 服务器中的 POST(或其他 HTTP)请求访问参数?

c# - 反对字符串,反之亦然

c# - 如何让 Entity Framework Code First 和可为空的外键属性工作?

PHP:for循环内的静态变量和for循环外的非静态变量有什么区别?

c# - Windows 窗体 ComboBox 导致间歇性 System.AccessViolationException

c# - 从 C# 创建并写入 Excel 文件

c# - 当代码块结束时,var 类型会发生什么?

c++ - 如何从 C++ 中的静态函数内部将指向静态函数的指针作为参数传递给另一个静态函数

c++ - 调用 Singleton getInstance() 时出现 undefined symbol 错误