【发布时间】:2013-03-25 18:44:27
【问题描述】:
我已经阅读了大量关于实例与静态类的内容,但没有找到我的问题的答案。在实例类引用的静态类中实例化不同的类有什么危险吗?
我正在使用的当前设计是实例类调用静态“记录器”方法(传递一系列参数)以将错误记录到文件系统中的文本文件中。我正在重构静态“Logger”方法来实例化一个参数类(这只是一系列属性和一些帮助方法以将自身作为 XML 或字符串返回)和一个 DBLogger 类来将错误记录到数据库而不是文件系统,将参数类作为唯一参数传递。
这个模型在我的旧 VB6 代码中运行良好,其中 Logger 类是实例化的,而不是静态的。
但现在在 .NET 代码中,我不确定是否应该将我的 2 个新类(参数和 DBLogger)设为静态,或者只是将 DBLogger 设为静态并将参数类实例化。我担心从静态类创建(或没有)实例的并发/多线程数据问题的可能性。我应该担心还是什么都不担心?
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
// all code truncated for illustration purposes
namespace ThisIs.A.Test
{
//INSTANCE
public class ErrorLogParameters
{
private int mThreadId = 0;
private int mErrorNumber = 0;
private string mServerDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
public int ThreadId
{
get { return mThreadId; }
set { mThreadId = value; }
}
public int ErrorNumber
{
get { return mErrorNumber; }
set { mErrorNumber = value; }
}
public string ServerDate
{
get { return mServerDate; }
}
}
//INSTANCE
public class ErrorLog
{
public void LogErrorToDatabase(ErrorLogParameters criteria)
{
//Log error to database here
}
}
//STATIC - Instantiates INSTANCE of ErrorLogParameters and ErrorLog
public class Logger
{
public static void WriteLog(string pstrObjectName, string pstrProcedureName, int plngErrNumber, string pstrErrDescription)
{
// create a new parameter object
ErrorLogParameters objParameters = new ErrorLogParameters();
// populate object properties
objParameters.ErrorNumber = mlngErrNumber;
objParameters.ThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
ErrorLog objErrorLog = new ErrorLog();
objErrorLog.LogErrorToDatabase(objParameters);
}
}
//INSTANCE - Invokes STATIC method
public class SomeInstance
{
private void ErrorHandler_Log(Exception exception, string procedureName, string additonalDescription, string stackTrace)
{
// call from instance class to static class
Logger.WriteLog(mstrObjectName, procedureName, mlngErrNumber, mstrErrDescription);
}
}
}
【问题讨论】:
-
你说的是单例模式吗?记录器通常作为单例实现,所以我认为你不会真的遇到很多问题。我认为带有子实例的记录器的这种静态概念很有意义。
-
如果您添加代码以更好地了解您在说什么,这将非常有帮助。