[c#] Count 속성 대 Count () 메서드?

컬렉션으로 작업하면 개체 수를 가져 오는 두 가지 방법이 있습니다. Count(속성) 및 Count()(방법). 주요 차이점이 무엇인지 아는 사람이 있습니까?

내가 틀렸을 수도 있지만 메서드가 컬렉션에 대해 일종의 쿼리를 수행 Count한다고 가정하기 때문에 항상 조건문 에서 속성을 사용합니다 . 그러나 그것은 추측입니다. 내가 틀렸다면 성능이 영향을 받을지 모르겠습니다.Count()Count

편집 : 호기심 Count()에서 컬렉션이 null이면 예외가 발생합니까? Count속성이 단순히 0을 반환 한다고 확신하기 때문 입니다.



답변

Count()확장 메서드 의 소스를 디 컴파일하면 객체가 ICollection(제네릭 또는 기타) 객체인지 테스트 하고 그렇다면 단순히 기본 Count속성을 반환합니다 .

따라서 코드가을 Count호출 하는 대신 액세스 하는 Count()경우 유형 검사를 우회 할 수 있습니다. 이론적 인 성능 이점이지만 눈에 띄는 이점이 아닐 수 있습니다!

// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    checked
    {
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        ICollection<TSource> collection = source as ICollection<TSource>;
        if (collection != null)
        {
            return collection.Count;
        }
        ICollection collection2 = source as ICollection;
        if (collection2 != null)
        {
            return collection2.Count;
        }
        int num = 0;
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}


답변

성능은 둘 중 하나를 선택하는 유일한 이유입니다. 선택 .Count()은 코드가 더 일반적임을 의미합니다. 더 이상 컬렉션을 생성하지 않는 일부 코드를 리팩토링 한 적이 있지만 대신 IEnumerable과 같은 좀 더 일반적인 코드를 리팩토링했지만 다른 코드는에 의존 .Count하고 .Count(). .Count()어디에서나 사용하도록 지적 하면 코드는 더 재사용 및 유지 관리가 가능할 것입니다. 일반적으로 더 일반적인 인터페이스를 사용하는 것이 최선의 방법입니다. 더 일반적인 것은 더 많은 유형으로 구현되는 더 단순한 인터페이스를 의미하므로 코드 간의 호환성이 향상됩니다.

내가 .Count()작성하는 코드의 재사용 가능성을 더 많이 다루는 다른 고려 사항이 있다고 말하는 것입니다.


답변

.Count()메서드 충분히 똑똑하거나 문제의 유형에 대해 알고있을 있으며, 그렇다면 기본 속성을 사용할 있습니다 .Count.

다시 말하지만 그렇지 않을 수도 있습니다.

컬렉션에 .Count속성 자체 가있는 경우 성능과 관련하여 최선의 선택이 될 것이라고 가정하는 것이 안전하다고 생각합니다 .

는 IF .Count()방법은 컬렉션에 대해 알고하지 않습니다, 그것은 O (N) 작업이 될 것이다, 그 위에 열거됩니다.


답변

Count()method는의 각 요소를 반복 IEnumerable<>하고 얼마나 많은 요소가 있는지 반환하는 확장 메서드입니다 . 의 인스턴스 IEnumerable가 실제로 List<>이면 Count모든 요소를 ​​반복하는 대신 속성 을 반환하도록 최적화되어 있습니다.


답변

Count()LINQ의 확장 메서드가 있는지 여부- 실제 .NET 컬렉션 개체의 Count속성입니다 List.

따라서 Count()컬렉션 / 쿼리 가능한 개체를 열거하기 때문에 거의 항상 느립니다. 목록, 대기열, 스택 등에서 Count. 또는 배열의 경우- Length.


답변

짧은 버전 : Count속성과 Count()방법 중에서 선택할 수있는 경우 항상 속성을 선택합니다.

차이점은 주로 운영 효율성에 있습니다. Count속성 을 노출하는 모든 BCL 컬렉션 은 O (1) 방식으로 수행합니다. 그러나이 Count()방법은 O (N)의 비용이들 수 있으며 종종 그렇게 될 것입니다. 일부 구현에 대해 O (1)에 시도하고 가져 오는 몇 가지 검사가 있지만 결코 보장되지는 않습니다.


답변

Count또는 Length속성 이있는 경우 Count()일반적으로 전체 컬렉션을 반복하여 포함 된 요소 수를 계산하는 메서드보다 항상 속성을 선호해야합니다 . Count()예를 들어 메서드가 LINQ to SQL 또는 LINQ to Entities 소스에 대한 경우는 예외입니다.이 경우 데이터 원본에 대해 개수 쿼리를 수행합니다. 그럼에도 불구하고 Count재산 이 있다면 할 일이 적기 때문에 그것을 선호 할 것입니다.