2016-01-07 19 views
6

Tek bir 'kullanma' ifadesinde iç içe geçmiş tek kullanımlıkların kullanımı hakkında hızlı soru: Tek kullanımlık kullanma ifadelerini her zaman yazmalı mıyım yoksa bunları bir yuvaya yerleştirebilir miyim? Örnek:İç içe geçirme 'Tek kullanımlık' ifadesi tek bir 'kullanma' ifadesiyle

using(FileStream inFile = new FileStream("myFile.txt", FileMode.Open)) 
using(GZipStream gzip = new GZipStream(inFile, CompressionMode.Decompress)) 
using(FileStream outFile = new FileStream("myNewFile.txt", FileMode.CreateNew)) 
{ 
    gzip.CopyTo(outstream); 
} 

vs

using(GZipStream gzip = new GZipStream(new FileStream("myFile.txt", FileMode.Open), CompressionMode.Decompress)) 
using(FileStream outFile = new FileStream("myNewFile.txt", FileMode.CreateNew)) 
{ 
    gzip.CopyTo(outstream); 
} 

Sadece merak blok yürütme bitince GZipStream veya kullanan açıklamada, çünkü "myfile.txt" ismi açıklanmayan FileStream temizlediğini alırsa eğer açık kalırsa ve bundan sonra da temizlenmesi gerekiyorsa.

Düzenleme: Sadece açık olmak gerekirse, ifadeleri kullanarak yuvalama hakkında sormuyorum. Başka bir IDisposable'ın 'using' ifadesinin içinde oluşturulmuş bir IDisposable'ın bloğun sonunda imha edilip edilmeyeceğini soruyorum. Neden ya da neden olmasın herhangi bir açıklaması takdir edilecektir.

+0

Olası çoğaltılabilir [C# içinde ifadelerle iç içe] (http://stackoverflow.com/questions/1329739/nested-using-statements-in-c-sharp) – Joshua

+3

FileStream yapıcısı başarılı olursa GZipStream yapıcısı başarısız olur. iyi oops. –

+1

Belki de IDisposable'ı uygulayan ve hata ayıklayıcıda ne olduğunu izleyen çok basit bir kukla sınıflar kümesi kurmaya değer mi? – DanS

cevap

6

Bu yapıcı bağlıdır, size bir bool alır overloads birini kullanıyorsanız ve leaveOpen için true geçmek müddetçe atarken geçirilen akışın GZipStream hizmetinde bulunmaktadır. Bununla birlikte, bunu yaparken bir riskle karşılaşırsınız. GZipStream, CanRead akışının false olduğu için bir ArgumentException atarsa, aktarılan iletilen iletiler elden çıkarılmaz. Şahsen, "yanlış gitmeyen bir şeye" bağımlı olmamayı tercih ederim ve bunun yerine genellikle savunma kodunu kodlamıyorum ve 3 deyim sürümünü kullanıyorum.


Düzenleme: Daha açıkçası, ben kullanarak ifadeleri iç içe düzenleme hakkında sormuyorum. içinde başka bir IDisposable'ın 'using' ifadesi içinde oluşturulan bir IDisposable'ın bloğun sonunda atılıp dağıtılmayacağını soruyorum. Neden ya da neden olmasın herhangi bir açıklaması takdir edilecektir. o zaman cevap olduğunu Sorunuz,

: Hayır, sadece nesne ki (using var whatever = ...) atandı ilan bertaraf edilecek oluşturulan diğer nesneler "dış" nesne ne varsa kod bağlıdır Dispose() yöntemlerini "zincirleme çağrısı" için uygulanacak.

1

Basit yanıt hayır - her nesneyi sarmanız gerekir.

3

blok yürütme bittiğinde her iki kurucular başarılı bile GZipStream

ile kullandığınız açıklamada, çünkü "myfile.txt" ismi açıklanmayan FileStream temizlediğini alırsa, hala bağlıdır 'sahip olma' sınıfının tasarımında. Bir StreamReader, BaseStream'i kapatacak ancak diğer pek çok sınıf işe yaramayacak.

Kodunuzun bu tür karışık ve değişiklik ayrıntılarına bağımlı olmasını istemiyorsunuz.

İlgili konular