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 checkedunchecked 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:

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:

Ayrıca bkz.