2010-07-19 6 views
8

sah ich einen Code von einem anderen Entwickler geschrieben, die etwa wie folgt aussieht:Würde die einfache Klasseninstanziierung jemals in C# fehlschlagen?

var stringBuilder = new StringBuilder(); 

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

(Es ist ganz über den Platz im Code)

Frage 1: Wäre das Fehlerprotokollierung Code selbst aufgerufen ? Wenn es keinen Speicher gäbe, würde nicht ein System.OutOfMemoryException in dieser ersten Zeile geworfen werden?

Frage 2: Kann ein Aufruf an einen Konstruktor jemals null zurückgeben?

+2

Technisch ist es möglich, für die Proxy-Klassen und nullables, wie Marc GRA aus hat darauf, aber es ist so ein pathologischer Fall, dass es sich nicht lohnt Berücksichtigung http://stackoverflow.com/questions/194484/whats-the- seltsamsten-Ecke-Fall-Sie-gesehen-in-c-oder-net –

Antwort

16

Sie haben Recht, und dieser Code ist falsch. Es wird OutOfMemoryException auf einen Fehler werfen. Dies ist klar in the documentation:

„Wenn der neue Betreiber Speicher zuzuweisen ausfällt, es wirft die Ausnahme OutOfMemoryException.“

Konstruktoren geben nichts zurück, geschweige denn null. Sie manipulieren ein Objekt, das bereits zugewiesen wurde.

2

Meine Annahme ist, dass der Coder in C++ arbeitete und nicht weiß, wie die Dinge in C# funktionieren.

+4

Der Code ist für C++ ebenso falsch. C++ 'new' löst' bad_alloc' aus, wenn die Zuweisung fehlschlägt, es sei denn, Sie sagen es ausdrücklich nicht. –

+0

Genau das sagte einer der Praktikanten hier. Ich selbst habe nicht viel C++ angefasst und nicht lange. Vielen Dank. –

+0

@Matthew: Ja - wenn Sie Standard C++ verwenden (und wissen, was Sie tun). Pre-Standard C++ hat null zurückgegeben, und der Autor hält seine Fähigkeiten offensichtlich nicht aktuell. –

1
  1. Nein. Eine OutOfMemoryException wird ausgelöst, wenn nicht genügend Speicher zum Zuweisen eines Objekts zur Verfügung steht.
  2. Kein
2

Nun dieser Code ist eine andere Geschichte:

StringBuilder stringBuilder = null; 

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

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

In diesem Fall String-Builder könnte (möglicherweise) null sein.

+1

Eigentlich wäre der StringBuilder nicht "null", er wäre nicht initialisiert. – Toby

+2

Eigentlich wird es nicht einmal kompilieren. Aber ich denke, wir können alle davon ausgehen, dass Brian meinte "StringBuilder stringBuilder = null;" anstatt: –

+2

Sorry guys. Der Code im Beispiel wurde korrigiert. Wer braucht einen Compiler? Ich sollte einfach einen Dienst schreiben, der meinen Code zur Auswertung an SO sendet :) –

0

Hier ist eine bessere Version des Codes. Sie hätten viel größere Probleme, wenn nicht genügend Speicher vorhanden wäre, um eine Referenz zuzuordnen.

StringBuilder stringBuilder = null; 

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