Декларативное программирование является изображением, где императивное программирование является инструкциями для рисования того изображения.
Вы пишете в декларативном стиле, если Вы "Говорите его, что это", вместо того, чтобы описать шаги, которые компьютер должен сделать для получения туда, где Вы хотите его.
при использовании XML для данных разметки Вы используете декларативное программирование, потому что Вы говорите, что "Это - человек, который является днем рождения, и там является конкретным адресом".
Некоторые примеры того, где декларативное и императивное программирование объединено для большего эффекта:
Windows Presentation Foundation использует декларативный синтаксис XML для описания то, на что пользовательский интерфейс похож, и что отношения (привязка) между средствами управления и базовыми структурами данных.
Структурированные конфигурационные файлы используют декларативный синтаксис (в качестве простого как "key=value" пары) для идентификации то, что означают строка или значение данных.
HTML повышает текст с тегами, которые описывают, какую роль каждая часть текста имеет относительно целого документа.
Это может немного упростить задачу, вы можете добавить этот метод для повторного использования:
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;
}
Вы можете использовать часто упускаемый из виду T4 (текстовый шаблон Transformation Toolkit) для генерации кода. Включено с Visual Studio 2008.
Об этом был эпизод .NET Rocks 2009-06: « Питер Фогель использует генерацию кода » .
Вы можете создать общую структуру, которая обрабатывает ленивое создание:
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;
}
}
Несмотря на то, что это не решает напрямую вашу проблему, вы можете взглянуть на новый класс Lazy
, который поставляется с .NET 4.0. Он специально разработан для сценариев отложенной инициализации.
Вы можете использовать оператор ??
, чтобы упростить код в одну строку:
protected ComplexType _propertyName;
public ComplexType PropertyName
{
get
{
return _propertyName ?? (_propertyName = new ComplexType());
}
}
В качестве примечания я бы, вероятно, избегал защищенных полей. Если вам нужно установить свойство из производного класса, я бы предпочел создать защищенный установщик.
Вы можете реализовать ленивую инициализацию примерно так:
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; }
}
Специфика инициализации не имеет значения, я написал это как это показывает, что вы можете сделать его прозрачно конвертируемым в неленивую версию и выполнить инициализацию при первом преобразовании. :)
Попробуйте использовать 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];
}
}