2010-07-19 10 views
8

vi algo de código escrito por otro desarrollador que se ve algo como esto:¿Alguna instanciación de clase simple podría fallar en C#?

var stringBuilder = new StringBuilder(); 

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

(Es por todo el lugar en el código)

Pregunta 1: ¿Eso código de registro de errores incluso ser llamado ? Si no hubiera memoria, ¿no se arrojaría un System.OutOfMemoryException en esa primera línea?

Pregunta 2: ¿Puede una llamada a un constructor devolver alguna vez nulo?

+2

Técnicamente es posible para las clases de proxy y nullables, como Marc Gravell ha señalado, pero es tal caso patológico que no vale la pena considerar: http://stackoverflow.com/questions/194484/whats-the- extraño-esquina-caso-has-visto-en-c-o-net –

Respuesta

16

Estás en lo cierto, y ese código es incorrecto. Arrojará OutOfMemoryException en caso de falla. Esto es claro en the documentation:

"Si el nuevo operador no puede asignar memoria, se lanza la excepción OutOfMemoryException ."

Los constructores no devuelven nada, y mucho menos nulo. Manipulan un objeto que ya ha sido asignado.

2

Mi suposición es que el codificador solía trabajar en C++, y no sabe cómo funcionan las cosas en C#.

+4

El código es igualmente erróneo para C++. C++ 'new' arroja' bad_alloc' cuando falla la asignación, a menos que explícitamente le diga que no lo haga. –

+0

Eso es exactamente lo que dijo uno de los internos aquí. Yo mismo no he tocado mucho C++, y no en mucho tiempo. Gracias. –

+0

@Matthew: sí, si usa Standard C++ (y sepa lo que está haciendo). Pre-Estándar C++ devolvió nulo, y claramente el autor no mantiene sus habilidades al día. –

1
  1. No. Se lanzará una OutOfMemoryException si no hay suficiente memoria disponible para asignar un objeto.
  2. Sin
2

Ahora, este código es una historia diferente:

StringBuilder stringBuilder = null; 

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

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

En ese caso, podría constructor de cadena (concebible) sea nula.

+1

En realidad, StringBuilder no sería 'nulo', sería sin inicializar. – Toby

+2

En realidad, ni siquiera compilará. Pero creo que todos podemos asumir Brian significaba escribir 'StringBuilder StringBuilder = NULL;' en lugar :) –

+2

siento chicos. Se corrigió el código en el ejemplo. ¿Quién necesita un compilador? Debería escribir un servicio que envíe mi código a SO para ser evaluado :) –

0

Aquí hay una mejor versión del código. Tendría problemas mucho más grandes si no hay memoria suficiente para asignar una referencia.

StringBuilder stringBuilder = null; 

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