Простой вопрос...
У меня есть средства управления, которые пользователь может перетащить вокруг на моей форме во времени выполнения. И они могут также удалить их... Если я просто Вызов .Dispose();
когда они нажимают удалить кнопку, или если я делаю что-то как panel1.Controls.Clear(Control);
?... Или что-то еще?
Спасибо :)
Баиль
То, что вы совершаете вызов метода, здесь не имеет значения. Инициализация ссылочного параметра во время вызова функции ничем не отличается от автономной инициализации ссылочного параметра и регулируется одними и теми же правилами.
Правила инициализации ссылок немного сложны, но суть в том, что если инициализатор является 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, когда вы закончили с ними, чтобы любые неуправляемые ресурсы, которыми они владеют, были немедленно освобождены.
Просто удалите элемент управления с панели:
panel.Controls.Remove(someControlInstance);
Как только на него больше не будет ссылок, он будет подвергнут сборке мусора, а неуправляемые ресурсы будут правильно утилизированы.