C# 为什么Count()方法使用";勾选“;关键词?

C# 为什么Count()方法使用";勾选“;关键词?,c#,checked,C#,Checked,在我看的时候,我想浏览一下Count()的源代码。我看到了下面的代码片段,其中我想知道为什么必须/需要checked关键字: int num = 0; using (IEnumerator<TSource> enumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { num = checked(num + 1); } return num; } int

在我看的时候,我想浏览一下
Count()
的源代码。我看到了下面的代码片段,其中我想知道为什么必须/需要
checked
关键字:

int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        num = checked(num + 1);
    }
    return num;
}
int num=0;
使用(IEnumerator enumerator=source.GetEnumerator())
{
while(枚举数.MoveNext())
{
num=已检查(num+1);
}
返回num;
}
源代码:

// 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;
    }
}
//System.Linq.Enumerable
使用系统集合;
使用System.Collections.Generic;
公共静态整数计数(此IEnumerable源)
{
if(source==null)
{
ThrowHelper.ThrowArgumentNullException(argument.source除外);
}
ICollection collection=源作为ICollection;
if(集合!=null)
{
返回集合。计数;
}
IIListProvider IIListProvider=源作为IIListProvider;
如果(iIListProvider!=null)
{
返回iIListProvider.GetCount(onlyIfCheap:false);
}
ICollection collection2=源作为ICollection;
if(collection2!=null)
{
返回集合2.计数;
}
int num=0;
使用(IEnumerator enumerator=source.GetEnumerator())
{
while(枚举数.MoveNext())
{
num=已检查(num+1);
}
返回num;
}
}

因为它不希望在序列中有超过20亿个项目的情况下返回负数(当然不太可能),或者在序列中有超过40亿个项目的情况下返回非负数但只是错误的数字(更不可能)<代码>已选中将检测溢出情况。

.NET 4.0尚未进行此检查,4.5已进行此检查。这可能是为了避免出现问题,请注意,他们使用uint。@DavidMårtensson C#默认为未选中的
;默认情况下,它可以通过编译器开关在全局级别翻转到
checked
,但坦率地说,我很少看到使用它,所以我认为认为认为C#“通常”在
checked
模式下运行是非常错误的;还要注意的是,
unsafe
unchecked
没有交互,这对我来说是个新闻,我在编写之前在一个项目中测试了它,C#抱怨溢出,直到我在它周围添加unchecked?编辑:找到了我看到的“对于常量表达式(可以在编译时完全计算的表达式),默认上下文始终处于选中状态。除非常量表达式显式放置在未选中的上下文中,否则在表达式的编译时计算期间发生的溢出会导致编译时错误。”@戴维姆尔滕森啊,是的,很好的细微差别;我说的是运行时;正如你所说:编译时间是不同的,但编译时间不适用于文章的例子,所以我的评论是不正确的,我已经删除了它。