2010-07-19 20 views
8

Başka bir geliştirici tarafından yazılmış bazı kodları gördüm:Basit sınıf örneği C# 'da başarısız olur mu?

var stringBuilder = new StringBuilder(); 

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

(Kodun içindeki herşeyin üzerindedir)

Soru 1: Bu hata kodlama kodu bile çağrılabilir mi? Hafıza yoksa, ilk satırda System.OutOfMemoryException atılmayacak mıydı?

Soru 2: Bir kurucuya bir çağrı hiç dönemez mi?

+2

Teknik Marc Gravell işaret ettiği gibi, vekil sınıfları ve nullables için mümkün, ama buna dikkate değer değil böyle bir patolojik durum: http://stackoverflow.com/questions/194484/whats-the- strangest-corner-case-youve-in-c-or-net –

cevap

16

Doğru ve bu kod yanlış. Bir hata durumunda OutOfMemoryException atar. Bu the documentation net olduğundan

"yeni operatör bellek ayırmaya başarısız olursa, istisna OutOfMemoryException atar."

Oluşturucular hiçbir şey döndürmez, boş bırakın. Daha önce tahsis edilmiş bir nesneyi manipüle ederler.

2

Benim varsayımım, kodlayıcının C++ 'da çalıştığı ve C#' de işlerin nasıl yürüdüğünü bilmediğidir.

+4

C++ için kod eşit yanlıştır. C++ 'new', açıkça belirtmediğiniz sürece, tahsis başarısız olduğunda" bad_alloc "atar. –

+0

Bu, stajyerlerden birinin burada söylediği şey. Ben çok fazla C++ değildim ve UZUN bir zamanda değil. Teşekkürler. –

+0

@Matthew: evet - Standard C++ kullanıyorsanız (ve ne yaptığınızı bilin). Pre-Standard C++ geri döndü ve açıkça yazarın becerilerini güncel tutmuyor. –

1
  1. Hayır. Bir nesne ayırmak için yeterli bellek yoksa bir OutOfMemoryException atılır.
  2. No
2

Şimdi, bu kodu farklı bir hikaye: Bu durumda

StringBuilder stringBuilder = null; 

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

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

, dize oluşturucu (makul) boş olabilir.

+1

Aslında, StringBuilder 'null' olmaz, başlatılmamış olur. – Toby

+2

Aslında, derleme bile yapılmayacak. Ama sanırım hepimiz Brian'ın 'StringBuilder stringBuilder = null;' yerine :) –

+2

özür dilerim. Örnekte kodu düzeltildi. Bir derleyiciye kim ihtiyacı var? Değerlendirmem için kodumu SO'ya gönderen bir hizmet yazmalıyım :) –

0

İşte bu kodun daha iyi bir sürümüdür. Yine de bir referans tahsis etmek için yeterli hafıza yoksa daha büyük sorunlarınız olur.

StringBuilder stringBuilder = null; 

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