C# - OOP - 类中的静态方法,它使用只运行一次的代码

时间:2012-03-23 16:11:00

标签: c# oop static

我有一个静态辅助方法(在非静态类上)进行一些计算,这些计算需要一定的数据对象,为了保持静态方法的简短和快速,我想预先处理这些数据对象并让静态方法使用它。

但是我将这个数据对象放在哪里可用于静态方法,同时确保它只创建一次?我应该把它放在一个单身的其他地方吗?

编辑:我被建议在我的类中使用静态变量,我尝试做类似下面的操作,当静态方法尝试使用它时,它是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();

3 个答案:

答案 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是一个选项,但为什么你不能让数据对象也是静态的呢?

如果可以从多个线程访问静态方法,显然你需要确保线程安全。