checked ve unchecked deyimleri (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; bir sabit ifadede taşma gerçekleşirse, derleme zamanı hatası oluşur. İşaretlenmemiş bir bağlamda, hedef türe uymayan yüksek sıralı bitler atılarak işlem sonucu kesilir. Örneğin, ekleme durumunda en büyük değerden minimum değere kaydırılır. Aşağıdaki örnekte hem hem de checked
unchecked
bağlamında aynı işlem gösterilmektedir:
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 1); // output: 0
}
try
{
checked
{
Console.WriteLine(a + 1);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
Not
İlgili sonuç türünün taşması durumunda kullanıcı tanımlı işleçlerin ve dönüştürmelerin 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şaretliiş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
ve unchecked
deyimleri ve işleçleri, aşağıdaki örnekte gösterildiği gibi 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 checked
işlev içindeki taşma denetimi bağlamını Multiply
etkilemediğini gösterir. İşlevin ikinci çağrısında Multiply
, işlevin ikinci bağımsız değişkenini hesaplayan ifade denetlenen bir bağlamda değerlendirilir ve deyiminin bloğunun checked
içinde metin olarak olduğu için bir özel durumla sonuçlanır.
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ı veyakarakter türünde) 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 tam sayı 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, sabit olmayan 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 denetlenmeyen bir bağlamda yürütülür.
Sabit ifadeler, denetlenen bir bağlamda varsayılan olarak değerlendirilir ve taşma durumunda derleme zamanı hatası oluşur. 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şaretlenmemiş deyimler
- İşaretli ve işaretsiz işleçler
- Kullanıcı tanımlı işaretli ve işaretsiz işleçler - C# 11