.Net의 배열에 길이가 있지만 다른 컬렉션 유형에 개수가있는 이유는 무엇입니까? [닫은]


23

예를 들어 C #에서 배열에는 길이 속성이 있습니다. 그러나 목록 등과 같은 다른 컬렉션 유형에는 Count 속성이 있습니다. 이 두 가지가 다른 이유가 있습니까? 그렇다면 알고 싶습니다.


4
나는 내 Lippert 호각을 찾을 수 없으므로 오늘 우리가 좋은 대답을 얻을 것이라고 생각하지 않습니다 :(
MetaFight

4
CLR이 어떻게 설계되었는지에 대한 내부 지식이 없으므로 컬렉션 유형 이전에 배열 작동 방식에 대한 세부 정보가 없습니다. 길이 속성을 호출하는 것이 가장 자연스러운 이름이며, 기존 표준을 따르지 않았기 때문에 이것이 배열 디자이너가 선택한 것입니다. 그런 다음 나중에 컬렉션을 지정했지만 길이는 일부 컬렉션에 적합하지 않습니다 (직선 성을 의미하므로 정렬되지 않은 컬렉션의 경우 합당한 이름이 아닙니다). 따라서보다 논리적으로 일관성있는 것으로 Count가 선택되었습니다.
Jules

4
이 이전 스택 오버 플로우 게시물에 정답 이 있다고 생각합니다 .
Doc Brown

6
@MetaFight : 최근에 일련의 교육용 비디오를 녹화했으며 어느 시점에서 디자이너가 왜 길이와 개수를 모두 사용했는지 전혀 모른다고 언급했습니다. 그것은 항상 기괴한 인상을 주었다. 위의 Jules의 의견은 그럴듯 해 보인다.
Eric Lippert

3
메타 노트-이 질문에 대한 답변이 확실하지 않다고 생각하여 5 번째 VTC를 제출했습니다. 기존 답변은 확실하고 그럴듯한 답변이지만 증거로 뒷받침되지는 않습니다. 마찬가지로 Lippert의 의견에 따르면 의식적인 결정에 반대하는 감독에 의한 것일 수도 있기 때문에 아무도 답을 알지 못한다고 생각합니다.

답변:


30

의미 상 그들은 상당히 다르기 때문에 다르게 명명됩니다.

컬렉션 수는 현재 저장된 항목 수이며 시간이 지남에 따라 변경 될 수 있습니다.

배열의 길이는 보유 할 수있는 최대 항목 수이며 (많은 항목을 저장하지 않아도 길이는 10 임) 변경할 수 없습니다.

예:

최대 100 개의 볼을 넣을 수있는 버킷이 있으면 길이는 100입니다. 50 개의 볼을 넣을 경우 카운트는 50입니다.

볼을 10 개 더 추가하면 Count는 60이되지만 Length는 여전히 100입니다. Length를 변경하려면 다른 버킷을 가져와야합니다.

후드 아래에는 항목 크기를 곱한 용량을 기준으로 연속 블록 (길이)의 메모리를 할당하기 때문에 Length라는 단어가 사용됩니다. List 클래스가 비슷한 (변경 가능하지만) 개념으로 "Capacity"를 사용한다는 사실은 배열이 역사적 이유로 "Length"라는 단어를 사용할 수 있음을 시사합니다.


12
T[]길이가 N 인 A 는 항상 정확히 N 유형의 값을 저장합니다 T. 의미 상으로 이러한 값이 모두 의미있는 null것은 아니지만 (예 : 값일 수 있음 ) 존재합니다. 이는 일반적인 용량 의미와 다릅니다 ( List<T>예 : 사용되는 용량 ). Count변경할 Length수없는 동안 변할 수있는 것이 옳습니다 . 다시 말하지만 Count실제로 변화를 요구하는 것은 없습니다 . 불변 컬렉션에도 사용됩니다.

@delnan 오 얘야. Capacity라는 단어가 이미 C #에서 사용되었다는 것을 알지 못했습니다. 실수로 오버로드했습니다. 이것을 지적 해 주셔서 감사합니다. 명확하게 답변을 업데이트하겠습니다.
combinatorics

용량과 길이의 차이는-객체의 수명주기 동안 용량이 변경 될 수 있지만 길이는 항상 동일하게 유지됩니다. 객체에 Length 속성이 표시되면 "하드"최대 수 (또는 테두리 / 인덱스)라고 가정하지만 Capacity 속성이 표시되면 확인해야하는 "소프트"최대 수라고 가정합니다. 내가 성능에 관심이 있다면 반대.
StupidOne

@StupidOne : 해당 경로로 이동하면 모든 배열에도 count-property 가 있어야합니다 .
중복 제거기

1
철야 등의 엄격한 언어의 StringBuilder를 ... 젠장 StringBuilder 클래스가 제대로 차단 컨벤션 처벌되었을 것입니다 github.com/munificent/vigil
팔코
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.