Лучшая практика для добавления средств управления во времени выполнения

bazel clean --expunge 
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel clean --expunge 
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
9
задан Pondidum 9 June 2009 в 15:14
поделиться

7 ответов

Поскольку спекуляции - пустая трата времени, я взял свою копию Reflector и взглянул на реальный код. Свойство Parent вызывает свойство ParentInternal, которое, в свою очередь, вызывает value.Controls.Add (this)

/* this code is part of the .NET Framework was decompiled by Reflector and is copyright Microsoft */
    internal virtual Control ParentInternal
    {
        get
        {
            return this.parent;
        }
        set
        {
            if (this.parent != value)
            {
                if (value != null)
                {
                    value.Controls.Add(this);
                }
                else
                {
                    this.parent.Controls.Remove(this);
                }
            }
        }
    }

На основе этого кода методы эквивалентны, и это строго вопрос предпочтений.

12
ответ дан 4 December 2019 в 12:20
поделиться

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

Кроме того, мне нравится первый оператор, потому что он более четко объясняет, что делает ваш код. Вы создаете новую кнопку и добавляете ее к существующим элементам управления на странице. Вы можете прочитать это сразу при отладке / рефакторинге и понять, что происходит. Во второй группе кода это немного более расплывчато. Если вы пропустили начальное объявление кнопки и увидели выражение btn.Parent = this, вы могли бы поверить, что переназначаете кнопку новой форме,

3
ответ дан 4 December 2019 в 12:20
поделиться

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

Button btn = new Button();
this.PlaceHolder1.Controls.Add(btn);

Button btn2 = new Button();
this.PlaceHolder2.Controls.Add(btn2);

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

Я считаю, что использование .Parent кода внутри делает .Controls.Add, поэтому они должны иметь тот же конечный результат, но для меня это сводится к читаемость кода.

Здесь есть аналогичный вопрос на StackOverflow .

3
ответ дан 4 December 2019 в 12:20
поделиться

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

Как уже было сказано, я предпочитаю

this.Controls.Add(btn);

, потому что он кажется более семантически подходящим для того, что вы на самом деле делаете. Я всегда использую этот метод, а не устанавливаю свойство Control.Parent .

1
ответ дан 4 December 2019 в 12:20
поделиться

Это действительно вопрос вкуса. Вот что происходит, когда вы устанавливаете свойство Parent для элемента управления Control . Этот код любезно предоставлен .NET Reflector.

set
{
    if (this.parent != value)
    {
        if (value != null)
        {
            value.Controls.Add(this);
        }
        else
        {
            this.parent.Controls.Remove(this);
        }
    }
}
0
ответ дан 4 December 2019 в 12:20
поделиться

Думаю, оба результата приводят к одному и тому же

-1
ответ дан 4 December 2019 в 12:20
поделиться

Мне лично нравится

Button btn = new Button();
//...
this.Controls.Add(btn);

, потому что это более явный и читаемый код.

-1
ответ дан 4 December 2019 в 12:20
поделиться