2015-01-22 12 views
5

checked bağlamında ya da değilse, C# kodu kullanarak, bir OverflowException'a neden olan/olmayan bir performans cezasıyla karşılaşmadan nasıl öğrenebilirim?İşaretli bir içerikte olup olmadığımı nasıl kontrol edebilirim?

+0

Bilmen için pratik bir neden var mı? Eğer başka bir bağlamda olmanız gerekiyorsa, 'kontrol' ve 'işaretlenmemiş' operatörler bunun içindir. Eğer biri ya da diğerinde olmanız gerekmiyorsa, neden bilmek istersiniz? –

+1

Korkarım ki '' OverflowException '' tek yol değilse de en kolay yoldur. – kennyzx

+0

@PrestonGuillot (Say) Ben sadece "kontrol edildi" ise aritmetik taşmaları atıyor [aritmetik işlem (http://stackoverflow.com/q/28059655/709537)] uygulamak istiyorum. –

cevap

4

checked vs unchecked arasındaki bir blok arasındaki tek fark, temel değer türü aritmetik işlemlerde derleyici tarafından oluşturulan IL talimatlarıdır. Başka bir deyişle, orada aşağıdaki arasında hiçbir gözlemlenebilir farktır:

checked { 
    myType.CallSomeMethod(); 
} 

ve

myType.CallSomeMethod(); 

Ama böyle iki tamsayı ekleme gibi bir aritmetik işlem, orada olduğunu söylemek sağlar. Yöntem için IL talimatlarını almanız ve yöntem aramanızın etrafındaki talimatların kontrol edilip edilmediğini ve hatta kurşun geçirmezlikten uzak olup olmadığını kontrol etmeniz gerekir. Özel işleminizin gerçekten kontrol edilen blok içinde olup olmadığını veya kontrol edilmemiş bloklarla çevrelenmediğini söyleyemezsiniz.

Hatta bu iki durumu birbirinden ayırt edemez çünkü bir istisna, çalışmaz alıcı:

checked { 
    int a = (Some expression that overflows); 
    myType.CallSomeMethod(); 
} 

ve

checked { 
    int a = (Some expression that overflows); 
} 
myType.CallSomeMethod(); 

Bu muhtemelen Decimal tipi tespit etmeye çalışmaz neden parçasıdır checked vs unchecked ve bunun yerine OverflowException'u atıyor.

İlgili konular