Установка Объектов к Пустому указателю/Ничему после использования в.NET

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

184
задан Chris Catignani 5 May 2019 в 06:53
поделиться

10 ответов

Karl абсолютно корректен, нет никакой потребности установить объекты в NULL после использования. Если объект реализует IDisposable, просто удостоверьтесь, что Вы звоните IDisposable.Dispose(), когда Вы сделаны с тем объектом (обернутый в try.. finally, или, using() блок). Но даже если Вы не помните звонить Dispose(), метод финализатора на объекте должен призывать Dispose() к Вам.

я думал, что это было хорошей обработкой:

Рытье в IDisposable

и это

IDisposable

Понимания Там не является никакой точкой в попытке к второму предположению GC и его стратегии управления, потому что это является самонастраиваемым и непрозрачным. Была хорошая дискуссия о внутренних работах с Jeffrey Richter на Dot-Net-Rocks здесь: у Jeffrey Richter в Windows Memory Model и книжный CLR Richters с помощью главы 20 C# есть большая обработка:

71
ответ дан Kev 23 November 2019 в 05:58
поделиться

Некоторый объект предполагает .dispose() метод, который вынуждает ресурс быть удаленным из памяти.

-1
ответ дан T.S. 23 November 2019 в 05:58
поделиться

Смотрите на эту статью также: http://www.codeproject.com/KB/cs/idisposable.aspx

По большей части, устанавливая объект в NULL не имеет никакого эффекта. Единственное время, которое, несомненно, необходимо будет сделать так, - то, если Вы работаете с "большим объектом", который является одним большим, чем 84K в размере (таком как битовые массивы).

1
ответ дан Scott Dorman 23 November 2019 в 05:58
поделиться

Существуют некоторые случаи, где это имеет смысл к нулевым ссылкам. Например, когда Вы пишете набор - как приоритетная очередь - и согласно Вашему контракту, Вы не должны поддерживать те объекты для клиента после того, как клиент удалил их из очереди.

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

На целом, Вы действительно не должны беспокоиться. Позвольте компилятору, и GC делают их работы, таким образом, можно сделать Ваши.

1
ответ дан Patrick 23 November 2019 в 05:58
поделиться

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

существует много способов ограничить объем переменной:

, Как упомянуто Steve Tranby

using(SomeObject object = new SomeObject()) 
{
  // do stuff with the object
}
// the object will be disposed of

Точно так же можно просто использовать фигурные скобки:

{
    // Declare the variable and use it
    SomeObject object = new SomeObject()
}
// The variable is no longer available

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

7
ответ дан mbillard 23 November 2019 в 05:58
поделиться

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

, Если объект реализует IDisposable и хранится в поле, я думаю, что хорошо аннулировать его, только избегать использования склонного объекта. Ошибки следующего вида могут быть болезненными:

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

хорошо аннулировать поле после расположения его и разобраться в NullPtrEx в строке, где поле используется снова. Иначе Вы могли бы столкнуться с некоторой загадочной ошибкой по линии (в зависимости от точно, что DoSomething делает).

7
ответ дан dbkk 23 November 2019 в 05:58
поделиться

Также:

using(SomeObject object = new SomeObject()) 
{
  // do stuff with the object
}
// the object will be disposed of
7
ответ дан Steve Tranby 23 November 2019 в 05:58
поделиться

Нет не делайте несуществующих объектов. Можно проверить http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx для получения дополнительной информации, но вещи установки в NULL ничего не сделают, кроме грязного код.

14
ответ дан Karl Seguin 23 November 2019 в 05:58
поделиться

Другая причина постараться не устанавливать объекты в NULL, когда Вы сделаны с ними, состоит в том, что это может на самом деле поддержать их для дольше.

, например,

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is now eligible for garbage collection         

    // ... rest of method not using 'someType' ...
}

позволит объекту, отнесенному someType быть GC'd после того, как вызов к "DoSomething", но

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is NOT eligible for garbage collection yet
    // because that variable is used at the end of the method         

    // ... rest of method not using 'someType' ...
    someType = null;
}

сможет иногда поддерживать объект до конца метода. JIT обычно будет оптимизируемый далеко присвоение на пустой указатель , таким образом, оба бита кода закончат тем, что были тем же.

36
ответ дан Wilka 23 November 2019 в 05:58
поделиться

Единственное время необходимо установить переменную в NULL, - когда переменная не выходит из объема, и Вам больше не нужны данные, связанные с ним. Иначе нет никакой потребности.

5
ответ дан Bob 23 November 2019 в 05:58
поделиться