Удалите (), ясный () или расположите ()

Простой вопрос...

У меня есть средства управления, которые пользователь может перетащить вокруг на моей форме во времени выполнения. И они могут также удалить их... Если я просто Вызов .Dispose(); когда они нажимают удалить кнопку, или если я делаю что-то как panel1.Controls.Clear(Control); ?... Или что-то еще?

Спасибо :)

Баиль

5
задан Josh Lee 6 February 2010 в 15:59
поделиться

2 ответа

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

Правила инициализации ссылок немного сложны, но суть в том, что если инициализатор является lvalue (аргумент в вызове метода в вашем случае) и тип ссылки совпадает с типом инициализатора (т.е. тип параметра совпадает с типом аргумента), то ссылка будет привязана непосредственно. Т.е. копия не создается.

Object a; // class type
Object &r = a; // no copying
const Object &cr = a; // no copying

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

const Object &tr = Object();

может быть интерпретировано компилятором как

const Object &tr = Object(Object(Object(Object())));

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

Классический пример, который часто вызывает споры о достоверности копирующего поведения компилятора, - это инициализация ссылки в выражениях, подобных следующей

Object a;
const Object &r = <some condition> ? a : Object();

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

-121--1721944-

Проверьте, Utf8Checker это простой класс, который делает именно это в чистом управляемом коде.

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

-121--689798-

Вы должны удалить его из родительской коллекции элементов управления, как описано в ответе Дарина Димитрова, а также вызвать Dispose:

panel.Controls.Remove(someControlInstance);
someControlInstance.Dispose();

Вы должны всегда вызывать Dispose на объектах, которые реализуют IDisposable, когда вы закончили с ними, чтобы любые неуправляемые ресурсы, которыми они владеют, были немедленно освобождены.

5
ответ дан 14 December 2019 в 08:49
поделиться

Просто удалите элемент управления с панели:

panel.Controls.Remove(someControlInstance);

Как только на него больше не будет ссылок, он будет подвергнут сборке мусора, а неуправляемые ресурсы будут правильно утилизированы.

2
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

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