Anlayışınız doğru. Bana mikro optimizasyon yapmaya çalışıyor gibi görünüyor. Türden emin olduğunuzda normal bir döküm kullanmalısınız. Daha mantıklı bir istisna oluşturmanın yanı sıra, hızlı bir şekilde başarısız olur. Türle ilgili varsayımınız yanlışsa, programınız hemen başarısız olur ve gelecekte bir NullReferenceException
veya bir veya ArgumentNullException
mantıklı bir hata beklemek yerine hemen hatanın nedenini görebilirsiniz . Genel olarak, bir yerde as
bir null
kontrolün ardından gelmeyen bir ifade kod kokusudur.
Öte yandan, dökümden emin değilseniz ve başarısız olmasını bekliyorsanız as
, bir try-catch
blokla sarılmış normal bir döküm yerine kullanmalısınız . Ayrıca, as
tip kontrolü ve ardından oyuncu kadrosu üzerinden kullanılması önerilir. Onun yerine:
if (x is SomeType)
((SomeType)x).SomeMethod();
hangi bir oluşturur isinst
talimat için is
anahtar kelime ve castclass
talimat döküm (etkili iki defa döküm gerçekleştirmek) için, kullanmak gerekir:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Bu sadece bir isinst
talimat oluşturur . Bir yarış koşulu, değişkenin is
denetim başarılı olduktan ve döküm hattında başarısız olduktan sonra türünü değiştirmesine neden olabileceğinden, önceki yöntemin çok iş parçacıklı uygulamalarda potansiyel bir kusuru vardır . İkinci yöntem bu hataya eğilimli değildir.
Aşağıdaki kodun üretim kodunda kullanılması önerilmez . C # 'da böyle temel bir yapıdan gerçekten nefret ediyorsanız, VB'ye veya başka bir dile geçmeyi düşünebilirsiniz.
Birinin döküm sözdiziminden umutsuzca nefret etmesi durumunda, oyuncuları taklit etmek için bir uzatma yöntemi yazabilir:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
ve düzgün bir [?] sözdizimi kullanın:
obj.To<SomeType>().SomeMethod()