Я видел некоторый код, написанный другим разработчиком, который выглядит примерно так:
var stringBuilder = new StringBuilder();
if(stringBuilder == null)
{
// Log memory allocation error
// ...
return;
}
(Это находится Повсеместно в коде),
Вопрос 1: та регистрация ошибок кодировала бы, даже названы? Если не было никакой памяти, не был бы System.OutOfMemoryException
быть брошенными на ту первую строку?
Вопрос 2: Может вызов конструктору когда-нибудь возвращать пустой указатель?
Вы правы, и этот код неверен. В случае сбоя это вызовет OutOfMemoryException
. Это ясно из документации :
«Если новый оператор не может выделить память, это вызывает исключение OutOfMemoryException. "
Конструкторы ничего не возвращают, не говоря уже о null. Они управляют уже выделенным объектом.
Этот код - другая история:
StringBuilder stringBuilder = null;
try { stringBuilder = new StringBuilder(); } catch(Exception) {}
if(stringBuilder == null)
{
// Log memory allocation error
// ...
return;
}
В этом случае построитель строк может (предположительно) иметь значение null.
Я предполагаю, что кодировщик работал на C ++ и не знает, как все работает на C #.
Вот лучшая версия кода. Однако у вас были бы гораздо большие проблемы, если бы не хватило памяти для выделения ссылки.
StringBuilder stringBuilder = null;
try {
stringBuilder = new StringBuilder();
}
catch(OutOfMemoryException) {
// log memory error
}