我有一个静态辅助方法(在非静态类上)进行一些计算,这些计算需要一定的数据对象,为了保持静态方法的简短和快速,我想预先处理这些数据对象并让静态方法使用它。
但是我将这个数据对象放在哪里可用于静态方法,同时确保它只创建一次?我应该把它放在一个单身的其他地方吗?
编辑:我被建议在我的类中使用静态变量,我尝试做类似下面的操作,当静态方法尝试使用它时,它是null:private const int X = 50;
private const int Y = 10;
private static readonly List<double> CrossSetting =
(from horizontal in Enumerable.Range(0, X)
from vertical in Enumerable.Range(0, Y)
select Process(horizontal, vertical)).ToList();
答案 0 :(得分:1)
Singleton引入了全局状态,因此经常被批评为反模式。你的类中一个好的旧的私有静态变量可能会很好,除非你必须将预处理的数据提供给你系统的其他部分。
答案 1 :(得分:1)
这可能是介绍Lazy<T>
的好时机:
class Helper
{
private const int X = 50;
private const int Y = 10;
private static Lazy<List<double>> lazy = new Lazy<List<double>>(() => (from horizontal in Enumerable.Range(0, X)
from vertical in Enumerable.Range(0, Y)
select Process(horizontal, vertical)).ToList());
// Didn't know what Process was
static double Process(double h, double v)
{
return h * v;
}
public static void Method()
{
List<double> data = lazy.Value;
foreach (double value in data)
Console.WriteLine(value);
}
}
Helper.Method将只创建一次数据。它还有一个好处,即如果从未调用Helper.Method,将永远不会创建数据。如果使用static readonly
,则会在第一次访问该类的任何成员时创建数据。它也是线程安全的。
答案 2 :(得分:0)
Singleton是一个选项,但为什么你不能让数据对象也是静态的呢?
如果可以从多个线程访问静态方法,显然你需要确保线程安全。