LazyAction в C #? - PullRequest
       32

LazyAction в C #?

0 голосов
/ 10 октября 2019

Есть ли способ в стандартном API C # для ленивой инициализации блока кода?

Я знаю Lazy<T>, но он предназначен для инициализации одной переменной и требует функции, которая возвращает T. Iхотелось бы что-то, что больше похоже на LazyAction.

private _lazyInit = new LazyAction( () => {
    ...
    // Do something big like get some data from DB
    ...
    _myField1 = ...
    _myField2 = ...
    ...
    do no return stuff.
}

public object get_Field1() { _lazyInit.EnsureDone(); return _myfield1; }
public object get_Field2() { _lazyInit.EnsureDone(); return _myfield2; }

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

1 Ответ

1 голос
/ 11 октября 2019

Хотя мне больше нравится предложение Йеруна Мостерта, вы можете сделать что-то вроде этого:

создать класс, содержащий ваш метод инициализации:

class LazyInitializer
{
    private readonly Action initFunc;

    class State { public bool Initialized = false; }

    public LazyInitializer(Action initFunc)
    {
        this.initFunc = initFunc;
    }

    public Action CreateInitializer()
    {
        var state = new State();

        return () =>
        {
            lock (state)
            {
                if (state.Initialized == false)
                {
                    initFunc();
                    state.Initialized = true;
                }
            }
        };
    }
}

, а затем использовать его следующим образом:

var lazyInit = new LazyInitializer(() =>
{
    //here your initialization code
    ...
    _myField1 = ...
    _myField2 = ...
    ...
});

//Create the initializer action
var initialize = lazyInit.CreateInitializer();

//use it like:
public object get_Field1() { initialize(); return _myfield1; }
public object get_Field2() { initialize(); return _myfield2; }
...