Будет ли простой экземпляр класса когда-либо потерпеть неудачу в C #? - PullRequest
8 голосов
/ 19 июля 2010

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

var stringBuilder = new StringBuilder();

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

(в коде ВСЕ это место)

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

Вопрос 2: Может ли вызов конструктора вернуть ноль?

Ответы [ 5 ]

16 голосов
/ 19 июля 2010

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

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

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

2 голосов
/ 19 июля 2010

Теперь этот код - другая история:

StringBuilder stringBuilder = null;

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

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

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

2 голосов
/ 19 июля 2010

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

1 голос
/ 19 июля 2010
  1. Нет.OutOfMemoryException будет выброшено, если недостаточно памяти для выделения объекта.
  2. Нет
0 голосов
/ 20 июля 2010

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

StringBuilder stringBuilder = null;

try {
   stringBuilder = new StringBuilder();
}
catch(OutOfMemoryException) {
   // log memory error
}
...