İşaretli ve işaretsiz deyimler (C# başvurusu)
checked
ve unchecked
deyimleri, tamsayı türü aritmetik işlemler ve dönüştürmeler için taşma denetimi bağlamını belirtir. Tamsayı aritmetik taşma gerçekleştiğinde, taşma denetimi bağlamı ne olacağını tanımlar. denetlenen bir bağlamda, bir System.OverflowException oluşturulur; taşma sabit bir ifadede gerçekleşirse, derleme zamanı hatası oluşur. İşaretlenmemiş bir bağlamda, hedef türe sığmayan yüksek sıralı bitler atılarak işlem sonucu kesilir. Örneğin, toplama en büyük değerden en düşük değere kaydırılır. Aşağıdaki örnekte aynı işlem hem işaretli hem de işaretsiz bir bağlamda gösterilmektedir:
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 3); // output: 2
}
try
{
checked
{
Console.WriteLine(a + 3);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Not
Kullanıcı tanımlı işleçlerin ve dönüştürmelerin taşma davranışı, önceki paragrafta açıklanandan farklı olabilir. Özellikle, kullanıcı tanımlı denetlenen işleçler denetlenen bir bağlamda özel durum oluşturmayabilir.
Daha fazla bilgi için Aritmetik işleçler makalesinin Aritmetik taşma ve sıfıra bölme ve Kullanıcı tanımlı işaretli işleçler bölümlerine bakın.
Bir ifadenin taşma denetimi bağlamını belirtmek için, aşağıdaki örnekte gösterildiği gibi ve unchecked
işleçlerini de kullanabilirsinizchecked
:
double a = double.MaxValue;
int b = unchecked((int)a);
Console.WriteLine(b); // output: -2147483648
try
{
b = checked((int)a);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
checked
aşağıdaki örnekte gösterildiği gibi ve unchecked
deyimleri ve işleçleri yalnızca deyim bloğunun veya işlecin parantezlerinin içinde metin olarak bulunan işlemler için taşma denetimi bağlamını etkiler:
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Yukarıdaki örnekte, yerel işlevin Multiply
ilk çağrısı, özel durum oluşturmadığından deyiminin işlev içindeki taşma denetimi bağlamını Multiply
etkilemediğini gösterirchecked
. İşlevin ikinci çağrısında Multiply
, işlevin ikinci bağımsız değişkenini hesaplayan ifade denetlenmiş bir bağlamda değerlendirilir ve deyimi bloğunun içinde metin olarak olduğu için bir özel durumla checked
sonuçlanır.
ve unchecked
davranışı checked
türüne ve işlemine bağlıdır. Tamsayılar için bile, her zaman gibi unchecked(x / 0)
işlemler mantıklı bir davranış olmadığından oluşturur. ve anahtar sözcüklerinin kodunuzu nasıl etkilediğini anlamak için türün checked
ve unchecked
işlemin davranışını denetleyin.
Sayısal türler ve taşma denetimi bağlamı
checked
ve unchecked
anahtar sözcükleri öncelikli olarak, mantıklı bir taşma davranışının olduğu integral türlerine uygulanır. İkilinin tamamlayıcı değerinde mantıklı hale gelen T.MinValue
sarmalama davranışıT.MaxValue + 1
. Temsil edilen değer türü için depolama alanına sığmadığından doğru değildir. Bu nedenle, bitler tam sonucun alt n bitlerini temsil eder.
Daha karmaşık bir değeri veya tamamlayıcı değerini temsil eden , float
, double
ve Half
gibi decimal
türler için sarmalama mantıklı değildir. Daha büyük veya daha doğru sonuçları hesaplamak için kullanılamaz, bu nedenle unchecked
yararlı değildir.
float
, double
ve Half
için makul doygunluk değerlerine PositiveInfinity
NegativeInfinity
sahiptir, böylece bir unchecked
bağlamda taşma algılayabilirsiniz. için decimal
böyle bir sınır yoktur ve doygunluk MaxValue
hatalara veya karışıklığa yol açabilir. kullanan decimal
işlemler hem hem checked
unchecked
de bağlamında oluşturur.
Taşma denetimi bağlamından etkilenen işlemler
Taşma denetimi bağlamı aşağıdaki işlemleri etkiler:
Aşağıdaki yerleşik aritmetik işleçler: işlenenleri tam sayı türünde (tam sayı veya karakter türü) veya sabit listesi türünde olduğunda, birli
--
-
++
, ve ikili*
-
+
, ve/
işleçleri.Tam sayı türleri arasında veya tam sayı türünden
float
veyadouble
tam sayı türüne açık sayısal dönüştürmeler.Not
Bir
decimal
değeri tamsayı türüne dönüştürdüğünüzde ve sonuç hedef türün aralığının dışında olduğunda, taşma denetimi bağlamından bağımsız olarak her zaman bir OverflowException oluşturulur.C# 11 ile başlayarak, kullanıcı tanımlı işaretli işleçler ve dönüştürmeler. Daha fazla bilgi için Aritmetik işleçler makalesinin Kullanıcı tanımlı işaretli işleçler bölümüne bakın.
Varsayılan taşma denetimi bağlamı
Taşma denetimi bağlamını belirtmezseniz CheckForOverflowUnderflow derleyici seçeneğinin değeri, tutarsız ifadeler için varsayılan bağlamı tanımlar. Varsayılan olarak bu seçeneğin değeri ayarlanmamıştır ve tamsayı türü aritmetik işlemler ve dönüştürmeler işaretsiz bir bağlamda yürütülür.
Sabit ifadeler, denetlenen bir bağlamda varsayılan olarak değerlendirilir ve taşma derleme zamanı hatasına neden olur. Deyimi veya işleciyle bir sabit ifade için işaretlenmemiş bağlamı unchecked
açıkça belirtebilirsiniz.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:
- İşaretli ve işaretsiz deyimler
- İşaretli ve işaretsiz işleçler
- Kullanıcı tanımlı işaretli ve işaretsiz işleçler - C# 11