[c#] Проблемы с добавлением ключевого слова `lazy` в C #


Answers

В системной библиотеке уже есть класс, который делает то, что вы хотите: Lazy<T>

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

Question

Я хотел бы написать код следующим образом:

class Zebra
{
    public lazy int StripeCount
    {
        get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
    }
}

EDIT: Почему? Я думаю, что это выглядит лучше, чем:

class Zebra
{
    private Lazy<int> _StripeCount;

    public Zebra()
    {
        this._StripeCount = new Lazy(() => ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce());
    }

    public lazy int StripeCount
    {
        get { return this._StripeCount.Value; }
    }
}

В первый раз, когда вы вызываете свойство, он запускает код в блоке get , а затем просто возвращает значение из него.

Мои вопросы:

  1. Какие затраты будут связаны с добавлением такого ключевого слова в библиотеку?
  2. В каких ситуациях это будет проблематично?
  3. Вы найдете это полезным?

Я не начинаю крестовый поход, чтобы получить это в следующей версии библиотеки, но мне любопытно, какие соображения должны иметь такую ​​функцию, как это должно пройти.




Вы пробовали / Dou вы имеете в виду это?

private Lazy<int> MyExpensiveCountingValue = new Lazy<int>(new Func<int>(()=> ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce()));
        public int StripeCount
        {
            get
            {
                return MyExpensiveCountingValue.Value;
            }
        }

РЕДАКТИРОВАТЬ:

после вашего редактирования сообщения я бы добавил, что ваша идея, безусловно, более изящна, но по-прежнему имеет ту же функциональность !!!.




Если вы не против использования CciSharp , CciSharp имеет эту функцию :

class Zebra {
  [Lazy] public int StripeCount {
    get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
  } 
} 





Related