Конструктор 'UserControl' с параметрами в C#

Сочетания клавиш. Как только Вы выясняете, какие виды запросов Вы пишете много, запишите служебные хранимые процедуры, чтобы автоматизировать задачи и отобразить их на сочетания клавиш. Например, эта статья говорит о том, как постараться не вводить "избранные лучшие 10 * от SomeBigTable", каждый раз Вы хотите просто получить беглый взгляд на демонстрационные данные из той таблицы. У меня есть значительно расширенная версия этой процедуры, отображенной на CTRL + 5 .
еще много я имею:

  1. CTRL + 0 : Быстро напишите сценарий данных таблицы, или proc, UDF или определения представления
  2. CTRL + 9 : найдите любой объект, имя которого содержит данную строку (для того, когда Вы знаете Вас существует процедура с "Опцией" на имя, но Вы не знаете то, что его имя запускает с)
  3. CTRL + 7 : найдите любой proc, UDF или представление, которое включает данную строку в ее код
  4. CTRL + 4 : найдите все таблицы, которые имеют столбец с именем

... и еще много, которые не приходят на ум прямо сейчас. Некоторые из этих вещей могут быть сделаны через существующие интерфейсы в SSMS, но окна и виджеты SSMS могут быть, немного замедляют загрузку, особенно когда Вы запрашиваете против сервера через Интернет, и я предпочитаю не иметь необходимость взять руки от клавиатуры так или иначе.

97
задан Neuron 15 November 2017 в 16:44
поделиться

7 ответов

Проектные решения, принятые в отношении того, как работает Windows Forms, более или менее исключают параметризованные .ctors для компонентов форм Windows. Вы можете их использовать, но когда вы это делаете, вы выходите за рамки общепринятых механизмов. Скорее, Windows Forms предпочитает инициализацию значений через свойства. Это допустимый метод проектирования, если он не используется широко.

Тем не менее, он имеет некоторые преимущества.

  1. Простота использования для клиентов. Клиентскому коду не нужно отслеживать кучу данных, он может немедленно создать что-то и просто увидеть это с разумными (если неинтересными) результатами.
  2. Простота использования для дизайнера. Код конструктора в целом более понятен и его легче анализировать.
  3. Не допускает необычных зависимостей данных внутри одного компонента. (Хотя даже Microsoft взорвала это с помощью SplitContainer )

Вот. s также много поддержки в формах для правильной работы с дизайнером в этой технике. Такие вещи, как DefaultValueAttribute , DesignerSerializationVisibilityAttribute и BrowsableAttribute , дают вам возможность предоставить расширенный клиентский опыт с минимальными усилиями.

(Это не единственное) Компромисс, который был сделан для взаимодействия с клиентом в формах Windows. Компоненты абстрактного базового класса тоже могут быть непростыми.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

Такие вещи, как DefaultValueAttribute , DesignerSerializationVisibilityAttribute и BrowsableAttribute , дают вам возможность предоставить расширенный клиентский опыт с минимальными усилиями.

(Это не единственное) Компромисс, который был сделан для взаимодействия с клиентом в формах Windows. Компоненты абстрактного базового класса тоже могут быть опасными.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

Такие вещи, как DefaultValueAttribute , DesignerSerializationVisibilityAttribute и BrowsableAttribute , дают вам возможность предоставить расширенный клиентский опыт с минимальными усилиями.

(Это не единственное) Компромисс, который был сделан для взаимодействия с клиентом в формах Windows. Компоненты абстрактного базового класса тоже могут быть непростыми.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

и BrowsableAttribute дают вам возможность предоставить богатый клиентский опыт с минимальными усилиями.

(Это не единственный компромисс, который был сделан для взаимодействия с клиентом в формах Windows. Компоненты абстрактного базового класса могут стать непростыми тоже.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

и BrowsableAttribute дают вам возможность предоставить богатый клиентский опыт с минимальными усилиями.

(Это не единственный компромисс, который был сделан для взаимодействия с клиентом в формах Windows. Компоненты абстрактного базового класса могут стать непростыми тоже.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

Компоненты абстрактного базового класса тоже могут быть непростыми.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

Компоненты абстрактного базового класса тоже могут быть непростыми.)

Я бы посоветовал придерживаться конструктора без параметров и работать в рамках принципов проектирования форм Windows. Если есть реальные предварительные условия, которые ваш UserControl должен обеспечить, инкапсулируйте их в другой класс, а затем назначьте экземпляр этого класса вашему элементу управления через свойство. Это также даст немного лучшее разделение проблем.

62
ответ дан 24 November 2019 в 05:30
поделиться

Я бы порекомендовал

public partial class MyUserControl : UserControl
{
    private int _parm1;
    private string _parm2;

    private MyUserControl()
    {
        InitializeComponent();
    }

    public MyUserControl(int parm1, string parm2) : this()
    {
        _parm1 = parm1;
        _parm2 = parm2;
    }
}

Так как в этом случае базовый конструктор всегда вызывается первым и любые ссылки на компоненты действительны.

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

В любом случае вы гарантируете, что ctor без параметров никогда не вызывается.

Я не тестировал это, поэтому, если он упадет, прошу прощения!

9
ответ дан 24 November 2019 в 05:30
поделиться

Есть две конкурирующие парадигмы для разработки классов:

  1. Используйте конструкторы без параметров и затем установите кучу свойств
  2. Используйте параметризованные конструкторы для установки свойств в конструкторе

Конструктор Windows Forms Visual Studio заставляет вас предоставлять конструктор без параметров для элементов управления для правильной работы. На самом деле, конструктор без параметров требуется только для создания экземпляров элементов управления, но не для их разработки (дизайнер фактически анализирует метод InitializeComponent при разработке элемента управления). Это означает, что вы можете использовать конструктор для разработки формы или пользовательского элемента управления без конструктора без параметров, но вы не можете разработать другой элемент управления для использования этого элемента управления, потому что конструктор не сможет создать его экземпляр.

Если вы этого не сделаете. t намереваются программно создавать экземпляры ваших элементов управления (т.е. создавать пользовательский интерфейс «вручную»), а затем не беспокойтесь о создании параметризованных конструкторов, поскольку они не будут использоваться. Даже если вы собираетесь программно создавать экземпляры элементов управления, вы можете захотеть предоставить конструктор без параметров, чтобы при необходимости их можно было использовать в конструкторе.

Независимо от того, какую парадигму вы используете, также, как правило, неплохо поместите длинный код инициализации в метод OnLoad () , тем более что свойство DesignMode будет работать во время загрузки, но не будет работать в конструкторе.

36
ответ дан 24 November 2019 в 05:30
поделиться

К сожалению, это проблема дизайна, которая будет возникать часто, а не только в области управления.

Часто возникают ситуации, когда вам нужен конструктор без параметров, даже если конструктор без параметров является не идеал. Например, для многих типов значений, IMO, было бы лучше без конструкторов без параметров, но невозможно создать конструктор, который работает таким образом.

В таких ситуациях вам нужно просто спроектировать элемент управления / компонент наилучшим образом. Использование разумных (и желательно наиболее распространенных) параметров по умолчанию может существенно помочь, поскольку вы можете хотя бы (надеюсь) инициализировать компонент с хорошим значением.

Кроме того, попробуйте спроектировать компонент таким образом, чтобы вы могли изменить эти свойства после создания компонента. С компонентами Windows Forms это обычно нормально,

4
ответ дан 24 November 2019 в 05:30
поделиться

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

4
ответ дан 24 November 2019 в 05:30
поделиться

Просто сделайте следующее:

public partial class MyUserControl : UserControl
{
    public MyUserControl() : this(-1, string.Empty)
    {
    }

    public MyUserControl(int parm1, string parm2)
    {
        // We'll do something with the parms, I promise
        if (parm1 == -1) { ... }
        InitializeComponent();
    }
}

Тогда «настоящий» конструктор сможет действовать соответствующим образом.

3
ответ дан 24 November 2019 в 05:30
поделиться

Предоставьте конструктор без параметров для дизайнера и сделайте его закрытым - если вы действительно должны сделать это таким образом ...: -)

РЕДАКТИРОВАТЬ: Ну, конечно, это не сработает для UserControls. Я явно не думал ясно. Дизайнер должен выполнить код в InitializeComponent (), и он не может работать, если конструктор является частным. Прости за это. Однако он работает с формами.

4
ответ дан 24 November 2019 в 05:30
поделиться
Другие вопросы по тегам:

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