2016-09-20 8 views
7

VBA.Collection.Count입니다. 이/A 방법보다는 게터해야 할 수처럼 5 명으로은 왜 VBA <code>Collection</code>는 방법이 있습니다 모두 5 개 회원을 가지고하는 방법

Count 방법이 보인다.

VB6 초기의 OOP/MS 디자인의 유산입니까? 컬렉션의 디자이너가 Count일 수도 있고 일 수있는 시간을 예상했는지, 방법으로 Count을 지정하여 이후의 동작 변경으로 인해 인터페이스/COM이 깨지지 않도록 할 수 있습니까? 짐 휴이트는 의견에서 지적 하듯이

편집, 온라인 문서 Count이 속성이지만, 개체 브라우저 및 MIDL 달리 제안하는 것이 제안합니다.

여기에 대한 문서의 VB6의 컬렉션의 개체 수를 포함 Collection.Count Property

롱 (긴 정수)를 돌려줍니다. 읽기 전용.

그러나 VB6의 개체 브라우저는이 보여줍니다 enter image description here

및 Excel 2016에서 , Count 확실히 외로운 모습과 는 게터로을 원한다처럼 ...

enter image description here

EDIT 22/Sep/16 :

나는Collection.Count이 방법 왜

정확히 을 설명하지 않습니다 ... 브루스 맥키 니하여 Visual 하드 코어 기본 5로 다시 언급하지만, 내가을 알 수없는 이유 대답에 약간의 길을 갈 않습니다

미지의를 알고있는 경우 :

아무것도 당신이 다음 버전에 대한 잘못된 것입니다 아마이 버전의 잘못이 될 수있는 컬렉션의 구현에 대해 알고 생각 Collection.Count는 방법입니다 이유. 구현 세부 사항에

:

컬렉션 클래스 Visual Basic 버전 4 제공은 좋은 일 개 버전이었다. Visual Basic 버전 5와 함께 제공되는 Collection 클래스는 좋은 2 버전이 아닙니다. 사용자는 많은 불만과 제안을했습니다. 그들 중 누구도 구현되지 않았습니다.컬렉션에

:

컬렉션은 무엇인가? 당신은 사용자 인터페이스를 알고 있지만 내부 데이터 구조가 실제로 작동하는 것을 알지 못합니다. 일반적으로 이는 우려 할 사항이 아닙니다. 그것이 작동하는 한 누가 그것을 어떻게 사용하는지 신경 써야합니까? 그러나 두 번째 생각에서 내부 구현은 작업의 효율성에 영향을 미칠 수밖에 없습니다. 일부 작업이 다른 작업보다 효율적이지 않은 경우 느린 작업을 피하는 것이 좋습니다. Collection.Item

:

비주얼 베이직을 만들었을 수도

[Collection.Item] [속성으로] 작동합니다. (그것은 요청했다.)

+1

아마도 컬렉션의 요소 수가 저장되지 않고 클래스에서 결코 알 수 없기 때문에 모든 요소를 ​​반복하여 계산할 수있는 유일한 방법은 .Count 메서드가 기본적으로 수행하는 것입니다. 나에게 이상한 보이지 않는 ... 그리고 예 VBA의 모든 VB6의 유산입니다. .NET 컬렉션은 그런 식으로 작동하지 않습니다. –

+1

분명히 인스턴스가 반복없이 'Count'를 알게하는 내부 필드가 있습니까? – ThunderFrame

+0

내기가 아니오, 그렇지 않습니다. 하나가 있다면 방법은 아무 의미가 없으며 당신이 말한 것처럼 재산이 될 것입니다. –

답변

2

를 지금까지 내가 실제로 이 방법입니다 말할 수 :

[ 
    odl, 
    uuid(A4C46780-499F-101B-BB78-00AA00383CBB), 
    helpcontext(0x000f7886), 
    hidden, 
    dual, 
    oleautomation 
] 
interface _Collection : IDispatch { 
    [id(00000000), helpcontext(0x000f7903)] 
    HRESULT Item(
        [in] VARIANT* Index, 
        [out, retval] VARIANT* pvarRet); 
    [id(0x00000001), helpcontext(0x000f7901)] 
    HRESULT Add(
        [in] VARIANT* Item, 
        [in, optional] VARIANT* Key, 
        [in, optional] VARIANT* Before, 
        [in, optional] VARIANT* After); 
    [id(0x00000002), helpcontext(0x000f7902)] 
    HRESULT Count([out, retval] long* pi4); 
    [id(0x00000003), helpcontext(0x000f7904)] 
    HRESULT Remove([in] VARIANT* Index); 
    [id(0xfffffffc)] 
    HRESULT _NewEnum([out, retval] IUnknown** ppunk); 
}; 

는 "왜"하지만 저를 이스케이프합니다.

+0

사실, "왜"는 질문의 핵심입니다. – ThunderFrame

+1

@ThunderFrame 나는 "왜"그가 마이크로 소프트 devs에 의해서만 대답 할 수 있었다고 생각한다. 아마도 그 먼지 같은 오래된 코드베이스를 보면서 똑같은 것을 궁금해하는 사람들 ... –

+0

아마 그것의 사용을 피하는 것과 관련이있다. 마샬링 오버 헤드를 낮게 유지하는 속성 이 경우 그렇게하는 것은 아마도 일반적인 관행으로 적용하는 습관 일 것입니다. – Bob77