同一个程序集中的两个类:Class A
和Static
Class B
在ClassA
的方法中,我在ClassB
中调用一个方法,但是我希望只调用一次,而不是每次都调用那个方法ClassA
...
目前我正在设置一个全局属性-Ran - 以查看该方法是否已经运行过......好吧它有效但我觉得这不是最好的设计。我想知道是否有更好的方法来做同样的事情?
感谢。
ClassA.MyMethod(...)
{
....
//....
if (ClassB.Ran != 1)
ClassB.Foo();
....
//...
}
答案 0 :(得分:9)
您需要注意“唯一一次”限制的严格程度。静态方法通常被认为是线程安全的;如果你真的想确保你的方法只运行一次,即使是赛车线程,那么你需要使用同步机制,最简单的例子是lock
:
private static bool isRun = false;
private static readonly object syncLock = new object();
public void MyMethod()
{
lock (syncLock)
{
if (!isRun)
{
Foo();
isRun = true;
}
}
}
答案 1 :(得分:7)
我通常会使用Lazy<T>
考虑:
public static class Test // this is your ClassB
{
private static Lazy<string> m_Property = new Lazy<string>( ()=>
{
Console.WriteLine("Lazy invoked");
return "hi";
},true);
public static string Property
{
get
{
Console.WriteLine("value request");
return m_Property.Value;
}
}
}
//....consuming code, this is in your ClassA somewhere
var test1 = Test.Property; // first call, lazy is invoked
var test2 = Test.Property; // cached value is used, delgate not invoked
var test3 = Test.Property; // cached value is used, delgate not invoked
var test4 = Test.Property; // cached value is used, delgate not invoked
var test5 = Test.Property; // cached value is used, delgate not invoked
这是输出:
value request
Lazy invoked
value request
value request
value request
value request
答案 2 :(得分:4)
您可以在类上使用私有静态字段,以便在第一次调用方法时设置结果,防止它再次运行:
class B
{
private static bool fooRun = false;
public static void Foo()
{
if (fooRun) { return; }
...
fooRun = true;
}
}
答案 3 :(得分:1)
只要将bool传递给构造函数,无论你是否想要运行它?类似的东西:
ClassA(bool runA)
{
if (runA)
{
ClassB.Foo();
}
}
答案 4 :(得分:1)
没有更多细节,很难说,但听起来B类中的这个方法包含某种初始化逻辑。如果只是在第一次引用类B时需要发生的事情,那么你可以将它放在类B的静态构造函数中。如果类B中的方法只需要在引用类A时运行,那么它可能是从类A的静态构造函数调用。如果在调用类A的某个方法之前无法调用它,并且它应该只从任何地方调用一次,那么我会说你应该从内部检查类B中的私有静态变量如果已经调用了该方法并立即返回。否则,作为最后的手段,我会说在A类中拥有一个私有静态变量会优于全局变量。
然而,在所有这些情况下,我都说你正在创造全球状态,这几乎总是表明设计不佳。在我看来,这种问题只是尖叫着需要一点“依赖注入”。