Count () 메소드가 "checked"키워드를 사용하는 이유는 무엇입니까?


23

Count와 Count ()의 차이점 을 살펴보면서 의 소스 코드를 한 눈에 보았습니다 Count(). checked키워드가 왜 필요한지 궁금해하는 다음 코드 스 니펫을 보았습니다 .

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

2
.NET 4.0에는 아직이 검사가 없었으며 4.5에는 없습니다. WinRT 반복자 에 대한 문제를 피하기 위해 이것이 수행되었을 가능성이 약간 있습니다. uint를 사용한다는 점에 유의하십시오.
Hans Passant

답변:


35

시퀀스에 20 억 개 이상의 홀수 항목이 있거나 (음수가 아닌) 경우에 음수가 아닌 잘못된 숫자가있는 경우 (물론 드물게) 이벤트에서 음수를 반환하고 싶지 않기 때문에 순서에 40 억 개 이상인 항목이 있다는 것입니다. checked오버플로 상태를 감지합니다.


1
@ DavidMårtensson C #의 기본값은 unchecked; checked컴파일러 스위치를 통해 기본적으로 전역 수준으로 뒤집을 수는 있지만 솔직히 나는 그것이 사용되는 것을 거의 볼 수 없으므로 C #이 "일반적으로" checked모드 에서 실행된다고 제안하는 것은 매우 잘못이라고 생각 합니다. 또한 노트 unsafe와 상호 작용이 없습니다unchecked
마크 Gravell

1
그건 나에게 뉴스 였고, 나는 글을 쓰기 전에 프로젝트에서 이것을 테스트했고 C #은 오버 플로우에 대해 불평하지 않고 추가 할 때까지 불평 했습니까? 편집 : 내가 본 것에 대한 답변을 찾았습니다 "상수 표현식 (컴파일 타임에 완전히 평가할 수있는 표현식)의 경우 기본 컨텍스트가 항상 확인됩니다. 상수 표현식이 확인되지 않은 컨텍스트에 명시 적으로 배치되지 않으면 컴파일 중에 발생하는 오버플로 -시간 계산으로 컴파일 타임 오류가 발생합니다. "
David Mårtensson

@ DavidMårtensson 아, 예-좋은 뉘앙스; 나는 런타임에 대해 이야기하고 있었다; 말한 것처럼 : 컴파일 시간이 다릅니다
Marc Gravell

그러나 컴파일 시간은 게시물의 예에 적용되지 않으므로 내 의견이 잘못되어 삭제되었습니다.
David Mårtensson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.