假设这个类:
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/