【问题标题】:C# - OOP - static method in class, which uses code that should only run onceC# - OOP - 类中的静态方法,它使用的代码应该只运行一次
【发布时间】:2012-04-08 05:10:51
【问题描述】:

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

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

编辑:有人建议我在我的类中使用静态变量,我尝试执行以下操作,当静态方法尝试使用它时它为空:

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();

【问题讨论】:

  • 不太清楚您要达到的目标。这是您可能问错问题的事情之一。与其尝试解决实际问题,不如尝试解决您认为可以解决实际问题的问题。
  • 我相信你可以像你说的那样写类,我想类似地看到它:单例+静态对象+静态方法。请发布您所说的演示。

标签: c# oop static


【解决方案1】:

这可能是介绍Lazy&lt;T&gt;的好时机:

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,数据将在第一次访问该类的任何成员时创建。它也是线程安全的。

【讨论】:

  • 哦,不知道Lazy,很好!
【解决方案2】:

Singleton 引入了全局状态,因此经常被批评为反模式。类中的一个好的旧私有静态变量可能会很好,除非您必须使该预处理数据可用于系统的其他部分。

【讨论】:

  • 同意,对我来说似乎是过早的优化。
  • 我在处理数据后总是需要数据 - 我尝试声明一个私有静态只读变量,但当我运行代码时,该变量为空。查看更新
  • @Madd0g 这意味着您试图在变量初始化之前使用它。阅读this answer 了解它是如何实现的。
【解决方案3】:

Singleton 是一种选择,但为什么不能只将数据对象也设为静态?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多