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 NullReferenceExceptionveya bir veya ArgumentNullExceptionmantıklı bir hata beklemek yerine hemen hatanın nedenini görebilirsiniz . Genel olarak, bir yerde asbir nullkontrolü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-catchblokla sarılmış normal bir döküm yerine kullanmalısınız . Ayrıca, astip kontrolü ve ardından oyuncu kadrosu üzerinden kullanılması önerilir. Onun yerine:
if (x is SomeType)
((SomeType)x).SomeMethod();
hangi bir oluşturur isinsttalimat için isanahtar kelime ve castclasstalimat 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 isinsttalimat oluşturur . Bir yarış koşulu, değişkenin isdenetim 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()