2016-09-20 3 views
7

VBA.Collection.Countあります。 5人のメンバーのなぜVBA <code>Collection</code>は方法であるすべてが5員を有する方法

それは/ ゲッターではなく方法でなければなりませんでしたように、Count方法が見えます。

これはVB6の初期のOOP/MSデザインの遺産ですか?コレクションのデザイナーは、Countの場合はがメソッドである必要があり、将来の動作上の変更によってインターフェイス/ COMが破損しないようにメソッドとしてCountを指定すると予測しましたか?

EDITジム・ヒューイットは、コメントで指摘するように、オンラインドキュメント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 Basic 5バックハードコアに

を呼び不可知を知ることに

:なぜCollection.Countは方法であるあなたがコレクションの実装について知っていると思う

ものは、このバージョンのために間違っているかもしれないと、おそらく次のバージョンのために間違っているだろう。実装の詳細に

:Visual Basicバージョン4が設けられて

コレクションクラスは良い1つのバージョンでした。 Visual Basicバージョン5で提供されるCollectionクラスは、良い2バージョンではありません。ユーザーは多くの苦情や提案をしました。いずれも実装されていません。コレクションで

コレクションとは何ですか?あなたはそのユーザー・インターフェースを知っていますが、内部データ構造によって実際に動作するかどうかは分かりません。通常、これは問題ではありません。それが動作する限り、どのように動作するのか気になる人はいますか?しかし、第二の考えでは、内部実装は操作の効率に影響を与えることに拘束されます。いくつかの操作が他の操作よりも効率的でない場合、遅い操作を避けるのが良いかもしれません。 Collection.Item

は、Visual Basicが行われている可能性が

[Collection.Item] [プロパティとして]働きます。 (それが要求されました。)

+1

おそらく、コレクションの要素の数が決して格納されず、クラスから決して知られていない可能性があります。そして、それを知る唯一の方法は、すべての要素を反復してカウントすることです。 doesntは私に奇妙に見える...そしてはい、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私は "なぜ"彼はMicrosoftのdevsによって答えられたのだろうと思う...おそらく、まったく同じものを疑問に思って、その埃の多い古いコードベースを見て... –

+0

おそらく使用を避けることと関係があるマーシャリングオーバーヘッドを低く保つためのプロパティこの場合、一般的なプラクティスとしてそれを適用するのはおそらく習慣に過ぎません。 – Bob77

関連する問題