如果您只需要在启动时设置一次设置,则建议创建一个非静态的包装类,该类在其自己的静态构造函数中执行所有静态类的初始化。这样,您可以确保它只会发生一次:
public class MyWrapper
{
public MyWrapper()
{
}
static MyWrapper()
{
UnManagedStaticClass.Initialize();
UnManagedStaticClass.Settings = ...;
}
public void Method1()
{
UnManagedStaticClass.Method1();
}
}
然而,如果您每次调用它都需要更改设置,并且希望使实例线程安全,则建议在静态对象上加锁,以便在另一个线程仍在使用静态设置时不会意外覆盖它们:
public class MyWrapper
{
public MyWrapper()
{
}
static MyWrapper()
{
UnManagedStaticClass.Initialize();
}
static object lockRoot = new Object();
public void Method1()
{
lock (lockRoot)
{
UnManagedStaticClass.Settings = ...;
UnManagedStaticClass.Method1();
}
}
}
如果您需要将初始化参数传递到类的实例构造函数中,那么您也可以通过拥有一个静态标志字段来实现:
如果你需要在类的实例构造函数中传递初始化参数,你也可以通过拥有一个静态标志字段来实现:
public class MyWrapper
{
public MyWrapper(InitParameters p)
{
lock (lockRoot)
{
if (!initialized)
{
UnManagedStaticClass.Initialize(p);
initialized = true;
}
}
}
static bool initialized = false;
static object lockRoot = new Object();
public void Method1()
{
lock (lockRoot)
{
UnManagedStaticClass.Settings = ...;
UnManagedStaticClass.Method1();
}
}
}
如果您每次需要重新初始化,但担心性能会因为重新初始化太慢而受到影响,那么除了可怕的单例之外,唯一的选择是自动检测是否需要重新初始化,并且只在必要时才执行。至少这样,它发生的唯一时间是两个线程同时使用两个不同实例的时候。您可以像这样执行:
public class MyWrapper
{
public MyWrapper(InitParameters initParameters, Settings settings)
{
this.initParameters = initParameters;
this.settings = settings;
}
private InitParameters initParameters;
private Settings settings;
static MyWrapper currentOwnerInstance;
static object lockRoot = new Object();
private void InitializeIfNecessary()
{
if (currentOwnerInstance != this)
{
currentOwnerInstance = this;
UnManagedStaticClass.Initialize(initParameters);
UnManagedStaticClass.Settings = settings;
}
}
public void Method1()
{
lock (lockRoot)
{
InitializeIfNecessary();
UnManagedStaticClass.Method1();
}
}
}