C # - OOP - статический метод в классе, который использует код, который должен запускаться только один раз - PullRequest
1 голос
/ 23 марта 2012

У меня есть статический вспомогательный метод (в нестатическом классе), который выполняет некоторые вычисления, эти вычисления требуют определенного объекта данных, чтобы статический метод был коротким и быстрым, я хочу предварительно обработать эти данныеобъект и пусть статический метод использует его.

Но куда мне поместить этот объект данных, чтобы он был доступен статическому методу, при этом убедившись, что он создан только один раз?Должен ли я просто поместить его в другое место в синглтоне?

РЕДАКТИРОВАТЬ: мне посоветовали использовать статическую переменную внутри моего класса, я попытался сделать что-то вроде следующего, и когда статический метод попытался использовать его, это было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 ]

1 голос
/ 23 марта 2012

Это может быть хорошее время, чтобы представить 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, данные будут созданы при первом обращении к любому члену класса. Это также потокобезопасный.

1 голос
/ 23 марта 2012

Синглтон вводит глобальное состояние и из-за этого часто критикуется как анти-паттерн. Хорошая старая закрытая статическая переменная внутри вашего класса, вероятно, подойдет, если только вы не сделаете эти предварительно обработанные данные доступными для других частей вашей системы.

0 голосов
/ 23 марта 2012

Синглтон - один из вариантов, но почему вы не можете просто сделать объект данных статичным?

Очевидно, что вам нужно убедиться, что вы потокобезопасны, если ваш статический метод доступен из нескольких потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...