c#中的实例类>
本文关键字:实例 | 更新日期: 2023-09-27 18:05:39
我已经做了很多关于实例与静态类的阅读,并没有找到我问题的答案。在实例类引用的静态类中实例化不同的类是否有任何危险?
我正在使用的当前设计是实例类调用静态"Logger"方法(传递一系列参数)将错误记录到文件系统中的文本文件中的一个。我正在重构静态"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);
}
}
}
不,这绝对没问题——如果你在一个方法中创建任何类的实例,声明该方法的类是否是静态类并不重要。
此外,除非你有一些"特殊"的东西(例如,一个静态变量计算创建的实例的数量),否则在创建新的对象时,与使用现有的对象时相比,你更不可能遇到并发问题。基本上,几乎所有并发性的棘手部分都是确定在哪里共享可变数据—它听起来不像这里的(尽管示例代码将有助于澄清这一点)。我将使用提供者和单例模式的组合。
创建一个抽象类Logger。
- Logger类包含用于写入日志的抽象方法。例如:
- Logger类包含Logger对象的私有实例。
- Logger类包含一个返回私有实例的静态属性。
- Logger类包含一个静态构造函数,用于实例化Logger对象的私有实例。您可能会使用反射并根据配置实例化对象。 实现一个继承自Logger对象的FileLogger。这个记录器写入一个文件。
- 实现从Logger对象继承的SQLLogger。这个记录器写入数据库。
- 等
像这样调用记录器:
- Logger.Instance.WriteInfo(信息),
- Logger.Instance.WriteError(异常),
使用这种设计有几个优点:
- 你的日志功能是完全抽象的。这完全将日志调用程序与写日志的代码分离开来。这允许您将日志写入任何数据存储。
- 您可以在不编译代码的情况下更改要使用的记录器。
- 单例保证线程安全
- 可测试性。您可以针对抽象类编写Mock测试。
静态方法没有并发性问题。