Count () yöntemi neden "işaretli" anahtar kelimesini kullanıyor?


23

Count ve Count () arasındaki farkı ararken , kaynak koduna bakmayı düşündüm Count(). checkedAnahtar kelime neden gerekli / gerekli merak ediyorum aşağıdaki kod snippet'i gördüm :

int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        num = checked(num + 1);
    }
    return num;
}

Kaynak kodu:

// System.Linq.Enumerable
using System.Collections;
using System.Collections.Generic;

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }
    ICollection<TSource> collection = source as ICollection<TSource>;
    if (collection != null)
    {
        return collection.Count;
    }
    IIListProvider<TSource> iIListProvider = source as IIListProvider<TSource>;
    if (iIListProvider != null)
    {
        return iIListProvider.GetCount(onlyIfCheap: false);
    }
    ICollection collection2 = source as ICollection;
    if (collection2 != null)
    {
        return collection2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num = checked(num + 1);
        }
        return num;
    }
}

2
.NET 4.0'da henüz bu denetim yoktu, 4.5. Bunun WinRT yineleyicileriyle ilgili sorunlardan kaçınmak için yapıldığını muhtemelen uint kullandıklarını unutmayın.
Hans Passant

Yanıtlar:


35

Çünkü (kuşkusuz olası olmayan) olayda negatif bir sayı, dizide 2 milyardan fazla tek öğe olduğu ya da (daha da olası olmayan) durumda negatif olmayan ama sadece yanlış bir sayı döndürmek istemediği için dizide 4 milyardan fazla tek öğe olduğu. checkedtaşma durumunu tespit eder.


1
@ DavidMårtensson C # varsayılan olarak unchecked; checkedvarsayılan olarak bir derleyici anahtarı aracılığıyla varsayılan olarak çevrilebilir - ama açıkçası ben nadiren kullanılan gördüm, bu yüzden C # "genellikle" checkedmodunda çalıştırmak için önermek çok yanlış olduğunu düşünüyorum ; not ayrıca, unsafebununla hiçbir etkileşimi yokturunchecked
Marc Gravell

1
Bu benim için bir haberdi, yazmadan önce bunu bir projede test ettim ve C #, etraftaki işaretlenmemiş olana kadar taşma konusunda şikayetçi oldu mu? Düzenleme: Ne gördüm yanıt bulundu "Sabit ifadeler (derleme zamanında tam olarak değerlendirilebilir ifadeler için), varsayılan bağlam her zaman denetlenir. Sabit bir ifade açıkça denetlenmeyen bir bağlamda yerleştirilmez sürece, derleme sırasında oluşan taşmalar ifadenin zaman değerlendirmesi derleme zamanı hatalarına neden olur. "
David Mårtensson

@ DavidMårtensson ah, evet - iyi bir nüans; Çalışma süresinden bahsediyordum; dediğiniz gibi: derleme zamanı farklı
Marc Gravell

Ancak derleme zamanı yazı örneği için geçerli değildir, bu yüzden yorumum yanlıştı ve sildim.
David Mårtensson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.