İş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, doubleve Half gibi decimaltü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, doubleve Half için makul doygunluk değerlerine PositiveInfinity NegativeInfinitysahiptir, böylece bir unchecked bağlamda taşma algılayabilirsiniz. için decimalbö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:

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:

Ayrıca bkz.