Установить переменные в "Ничто", это хорошая практика? - PullRequest
4 голосов
/ 27 января 2011

Если я получил

Dim myRect As Rectangle = New Rectangle(0,0,100,100)

Это необходимо или просто штраф , чтобы позже сделать это:

myRect = Nothing

Или это не такне нужно?Спасибо.

ЕСЛИ это необходимо, есть ли другие случаи, это не для моих переменных?

Ответы [ 2 ]

7 голосов
/ 27 января 2011

В общем, как сказал Джоэл , это не нужно.

В вашем конкретном примере, однако, это на самом деле бессмысленно . Rectangle - это тип значения , поэтому установка его на Nothing не даже влияет на счетчик ссылок объекта; он присваивает новое значение (значение по умолчанию для Rectangle) вашей переменной myRect. Это аналогично наличию переменной Integer и установке ее в 0 в конце метода. Ничего не покупает.


Я должен отметить, что утверждение «Установка любой переменной равной Nothing [или null в C #] никогда ничего не достигнет» * является мифом. Вполне возможно, что у вас может быть поле в классе, которое вы также можете установить на null, если ссылочный объект больше не нужен, но у вас все еще есть ссылка на сам экземпляр класса.

В качестве упрощенного примера предположим, что у вас есть некоторый контейнерный класс, который упаковывает массив T[], и вы даете этому контейнеру метод Empty. В этом методе может иметь смысл установить для внутреннего массива контейнера значение null, что приведет к нулевым ссылкам на объект массива, что квалифицирует его для сборки мусора. (Затем вы создадите новый массив, когда внешний код в следующий раз попытается добавить T в коллекцию.) Если вы не установили для поля значение null в Empty, тогда все равно будет ссылка на массив (т.е. , поле), и поэтому будет использоваться небольшой объем памяти, который вам действительно не нужен.

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

* На самом деле я не цитирую здесь никого конкретного; это просто чрезмерное обобщение, о котором я слышал несколько раз.

5 голосов
/ 27 января 2011

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

...