C#, Эквивалентный для Макросов C++ и использования Автоматического <> Свойства

Декларативное программирование является изображением, где императивное программирование является инструкциями для рисования того изображения.

Вы пишете в декларативном стиле, если Вы "Говорите его, что это", вместо того, чтобы описать шаги, которые компьютер должен сделать для получения туда, где Вы хотите его.

при использовании XML для данных разметки Вы используете декларативное программирование, потому что Вы говорите, что "Это - человек, который является днем рождения, и там является конкретным адресом".

Некоторые примеры того, где декларативное и императивное программирование объединено для большего эффекта:

  • Windows Presentation Foundation использует декларативный синтаксис XML для описания то, на что пользовательский интерфейс похож, и что отношения (привязка) между средствами управления и базовыми структурами данных.

  • Структурированные конфигурационные файлы используют декларативный синтаксис (в качестве простого как "key=value" пары) для идентификации то, что означают строка или значение данных.

  • HTML повышает текст с тегами, которые описывают, какую роль каждая часть текста имеет относительно целого документа.

10
задан Ryall 12 August 2017 в 13:34
поделиться

7 ответов

Это может немного упростить задачу, вы можете добавить этот метод для повторного использования:

protected ComplexType _propertyName;
public ComplexType PropertyName
{
    get
    {
        return GetProperty(ref _propertyName);
    }
}
.
.
private T GetProperty<T>(ref T property) where T : new()
{
  if (property == null)
    property = new T();
  return property;
}
22
ответ дан 3 December 2019 в 13:17
поделиться

Вы можете использовать часто упускаемый из виду T4 (текстовый шаблон Transformation Toolkit) для генерации кода. Включено с Visual Studio 2008.

Об этом был эпизод .NET Rocks 2009-06: « Питер Фогель использует генерацию кода » .

2
ответ дан 3 December 2019 в 13:17
поделиться

Вы можете создать общую структуру, которая обрабатывает ленивое создание:

public struct LazyCreate<T> where T : class, new() {
   private T _value;
   public T Value {
      get {
         if (_value == null) {
            _value = new T();
         }
         return _value;
      }
   }
}

protected LazyCreate<ComplexType> _propertyName;
public ComplexType PropertyName {
    get {
        return _propertyName.Value;
    }
}
11
ответ дан 3 December 2019 в 13:17
поделиться

Несмотря на то, что это не решает напрямую вашу проблему, вы можете взглянуть на новый класс Lazy , который поставляется с .NET 4.0. Он специально разработан для сценариев отложенной инициализации.

6
ответ дан 3 December 2019 в 13:17
поделиться

Вы можете использовать оператор ?? , чтобы упростить код в одну строку:

protected ComplexType _propertyName;
public ComplexType PropertyName
{
  get
  {
    return _propertyName ?? (_propertyName = new ComplexType());
  }
}

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

16
ответ дан 3 December 2019 в 13:17
поделиться

Вы можете реализовать ленивую инициализацию примерно так:

  public class Lazy<T> where T : new()
   {
       private T _value;
       private bool _isInitialized;

       private T GetValue()
       {
           if (!_isInitialized)
           {
               _value = new T();
               _isInitialized = true;
           }

           return _value;
       }

       public static implicit operator T (Lazy<T> t)
       {
           return t.GetValue();
       }
   }

, что позволит вам писать такой код:

      private Lazy<ComplexType> _lazyCt = new Lazy<ComplexType>();
      public ComplexType LazyCt
      {
          get { return _lazyCt; }
      }

Специфика инициализации не имеет значения, я написал это как это показывает, что вы можете сделать его прозрачно конвертируемым в неленивую версию и выполнить инициализацию при первом преобразовании. :)

1
ответ дан 3 December 2019 в 13:17
поделиться

Попробуйте использовать Hashtable или Dictionary , чтобы сгруппировать все свойства. Примерно так:

protected Dictionaty<string, ComplexType> _properties = new Dictionaty<string, ComplexType>();
public ComplexType Property(string name)
{
    get
    {
        if (!properties.ContainsKey(name))
            _properties[name] = new ComplexType();

        return __properties[name];
    }
}
0
ответ дан 3 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: