2010-07-19 6 views
8

Ho visto alcuni codice scritto da un altro sviluppatore che sembra qualcosa di simile:Una semplice istanziazione di classe fallirebbe mai in C#?

var stringBuilder = new StringBuilder(); 

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

(E 'tutto il luogo nel codice)

Domanda 1: Vorrei che il codice di registrazione di errore anche ottenere chiamato ? Se non ci fosse memoria, un System.OutOfMemoryException non verrebbe lanciato su quella prima riga?

Domanda 2: Una chiamata a un costruttore può mai restituire null?

+2

Tecnicamente è possibile per le classi proxy e nullables, come Marc Gravell ha sottolineato, ma è un caso patologico che non è opportuno prendere in considerazione: http://stackoverflow.com/questions/194484/whats-the- stranissimo-angolo-caso-hai visto-in-c-o-net –

risposta

16

Sei corretto e il codice è sbagliato. Lanciare OutOfMemoryException in caso di errore. Questo è evidente nel the documentation:

"Se il nuovo operatore non riesce ad allocare memoria, getta l'eccezione OutOfMemoryException ."

I costruttori non restituiscono nulla, per non parlare di null. Manipolano un oggetto che è già stato allocato.

2

La mia ipotesi è che il codificatore utilizzato per lavorare in C++, e non sa come funzionano le cose in C#.

+4

Il codice è ugualmente sbagliato per C++. C++ 'new' lancia' bad_alloc' quando l'allocazione fallisce, a meno che tu non glielo dici esplicitamente. –

+0

Questo è esattamente quello che uno degli stagisti ha detto qui. Io stesso non ho toccato molto C++, e non in un LUNGO tempo. Grazie. –

+0

@Matthew: sì - se si utilizza lo standard C++ (e si sa cosa si sta facendo). Pre-Standard C++ ha restituito null, e chiaramente l'autore non sta mantenendo le sue competenze attuali. –

1
  1. No. Un'eccezione OutOfMemoryException viene generata se non è disponibile memoria sufficiente per allocare un oggetto.
  2. No
2

Ora, questo codice è una storia diversa:

StringBuilder stringBuilder = null; 

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

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

In tal caso, costruttore stringa potrebbe (in teoria) essere nullo.

+1

In realtà, StringBuilder non sarebbe "null", sarebbe non inizializzato. – Toby

+2

In realtà, non verrà nemmeno compilato. Ma penso che tutti possiamo supporre che Brian intendesse scrivere 'StringBuilder stringBuilder = null;' invece :) –

+2

Scusate ragazzi. Risolto il codice nell'esempio. Chi ha bisogno di un compilatore? Dovrei semplicemente scrivere un servizio che manda il mio codice in SO per essere valutato :) –

0

Ecco una versione migliore del codice. Avresti problemi molto più grandi se non c'è abbastanza memoria per allocare un riferimento.

StringBuilder stringBuilder = null; 

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