Простое инстанцирование класса когда-либо перестало бы работать в C#?

Я видел некоторый код, написанный другим разработчиком, который выглядит примерно так:

var stringBuilder = new StringBuilder();

if(stringBuilder == null)
{
    // Log memory allocation error
    // ...
    return;
}

(Это находится Повсеместно в коде),

Вопрос 1: та регистрация ошибок кодировала бы, даже названы? Если не было никакой памяти, не был бы System.OutOfMemoryException быть брошенными на ту первую строку?

Вопрос 2: Может вызов конструктору когда-нибудь возвращать пустой указатель?

8
задан John Bubriski 19 July 2010 в 18:39
поделиться

5 ответов

Вы правы, и этот код неверен. В случае сбоя это вызовет OutOfMemoryException . Это ясно из документации :

«Если новый оператор не может выделить память, это вызывает исключение OutOfMemoryException. "

Конструкторы ничего не возвращают, не говоря уже о null. Они управляют уже выделенным объектом.

16
ответ дан 5 December 2019 в 07:56
поделиться

Этот код - другая история:

StringBuilder stringBuilder = null;

try { stringBuilder = new StringBuilder(); } catch(Exception) {}

if(stringBuilder == null)
{
    // Log memory allocation error
    // ...
    return;
}

В этом случае построитель строк может (предположительно) иметь значение null.

2
ответ дан 5 December 2019 в 07:56
поделиться
  1. Нет. Если не хватает памяти для выделения объекта, будет выброшено исключение OutOfMemoryException.
  2. No
1
ответ дан 5 December 2019 в 07:56
поделиться

Я предполагаю, что кодировщик работал на C ++ и не знает, как все работает на C #.

2
ответ дан 5 December 2019 в 07:56
поделиться

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

StringBuilder stringBuilder = null;

try {
   stringBuilder = new StringBuilder();
}
catch(OutOfMemoryException) {
   // log memory error
}
0
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

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