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; 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, ekleme durumunda 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

Taşma 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ş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.

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 işaretsiz 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.