Есть ли какие-либо преимущества перед использованием метода Clear перед тем, как сделать коллекцию нулевой.
Невозможно сказать без хорошего Minimal, Complete, and Verifiable code example.
При этом ни один из этих фрагментов кода не выглядит очень полезным для меня. Первое наверняка было бы бессмысленным, если все, что делает метод Clear()
, - это очистить коллекцию. Конечно, если он действительно прошел и, например, называемый Dispose()
для каждого члена коллекции, который будет другим. Но это будет очень необычная реализация коллекции.
Даже вторая имеет очень мало значения и противоречит обычной семантике IDisposable
. IDisposable
должен быть предназначен только для управления неуправляемыми ресурсами. Он иногда используется для других целей, но это его основная цель. В частности, обычно перед вызовом объекта обычно вызывается Dispose()
. Если сам объект будет отброшен, то любые ссылки, которые он хранит для других объектов (например, коллекция), больше не будут доступны, поэтому их установка null
не имеет никакого полезного эффекта.
Фактически, в некоторых случаях установка переменной на null
может фактически продлить срок службы объекта. Среда выполнения достаточно сложна, чтобы распознать, что переменная больше не используется, и если она содержит последнюю оставшуюся ссылку на объект, объект может стать пригодным для сбора мусора в этой точке, даже если область действия переменной продолжается дальше. Установив переменную в null
, сама переменная используется позже в программе, и поэтому среда выполнения не может рассматривать ее как недоступную до этой точки позже, чем в противном случае.
Этот последний пункт обычно применяется чаще всего к локальным переменным, а не к полям в объекте. Но теоретически возможно, чтобы среда выполнения оптимизировалась более широко. Это плохая привычка входить, чтобы переместиться к настройкам на null
переменных, которые сами не собираются быть намного дольше.
это может помочь http://stackoverflow.com/questions/11717416/clearing-a-private-collection-or-setting-it-to-null –
@ Dev.Joel: ваш связанный вопрос включает класс, который будет продолжаться который будет использоваться после вызова метода 'Reset()' (в первую очередь это сомнительная функция в классе, поскольку, предполагая разумную реализацию такого метода, можно было бы сделать то же самое, просто выделив новый экземпляр). Здесь ОП задает вопрос об объекте, который находится в распоряжении; поскольку по соглашению объект не должен использоваться после того, как его метод 'Dispose()' был вызван, можно с уверенностью предположить, что объект, находящийся в распоряжении, фактически не будет использоваться снова, поэтому (маргинальное) пособие, упомянутое в другом ответе, не будет Не применяйте. –