2011-06-19 21 views
10

Olası yinelenen olarak obj vs: C# döküm iki farklı şekilde gördük
casting vs using the 'as' keyword in the CLRC# farklı yolları - (T) obj T

. Örneğin

:

MyObj foo = (MyObj) bar; // this is what I see most of the times 
MyObj foo = bar as MyObj; // I do see this sometimes 
  • Yani, temel fark nedir?
  • style 1 ve style 2 döküm için uygun adlar nelerdir?
  • Neyi kullanacağınıza nasıl karar veririm?
  • Önemli performans sorunları var mı?
  • Bu konuyla ilgili bilmem gereken başka bir şey var mı? Dökme geçersizse

Bu sayede ilgilendiğiniz için çok :) ("doğrudan" veya "C tarzı" cast)

cevap

24

İlki bir istisna atar. Nesne üzerinde gerçek tip dönüşümü gerçekleştirmenin tek yolu da budur. (Sadece döküm değişken türünü değiştirir, çünkü tip dönüşüm Nesnenin bir * farklı tür verir, oysa bu tür dönüştürme döküm farklıdır.) Örnek

ikinci bir (herhangi bir isim, her ne kadar mümkün "VB.NET'te çağrıldığı gibi" cast "denir), InvalidCastException'u atmak yerine yerine olarak değerlendirir. (Bu davranış nedeniyle, yalnızca referans türleri için çalışır).

Birbiriyle karşılaştırıldığında önemli bir performans sorunu yoktur. Eğer sonuç geçerli olmayabilir beklemek yalnızca

Sen as kullanın. Aksi halde, ilkini kullanın. Sorunuzun parçaları için arada


, MSDN might be helpful:

as operatör dökme işlemi gibidir. Ancak, dönüşüm mümkün değilse, istisna oluşturmak yerine null döndürür. Aşağıdaki ifadeyi göz önünde bulundurun: Bu ifade yalnızca bir kez değerlendirilmek dışında aşağıdaki ifadeye eşdeğerdir.

expression is type ? (type)expression : (type)null 

Not as operatörü sadece referans dönüşüm ve boks dönüşüm gerçekleştirir. as operatörü, kullanıcı tanımlı dönüşümler gibi diğer dönüşümleri gerçekleştiremez, bunun yerine cast ifadeleri kullanılarak gerçekleştirilmesi gerekir.

+1

Döküm içermeyen, ancak aynı sözdizimini döküm olarak kullanan tip dönüştürme işleçlerinden bahsetmediniz. –

+1

@Merlyn: Tamam ekleyeceğim, teşekkürler. :) @pst: Temizlik için teşekkürler! – Mehrdad

+1

'Foo = SomeType olarak bar'; 'if (bar SomeType) {foo = (SomeType) bar; } ', çünkü tür yalnızca bir kez kontrol edilir. Ve bu, "foo = (SomeType)" çubuğunu denemek yerine * çok daha hızlıdır; } catch (InvalidCastException) {} eğer dönüştürme başarısız olursa, istisnalar oldukça pahalıdır. – Sven