2009-04-15 9 views
2

Ich habe ein Problem, bei dem auf eine Sammlung von Objekten nicht korrekt zugegriffen wird, wenn sie auf einem Thread von einem Dienst ausgeführt werden. Ich kann meine Unit-Tests in VS2008 gut ausführen, aber wenn ich den Debugger an den Service anschließe, kann ich deutlich sehen, dass es nicht beim 1-basierten Index, sondern beim 0-basierten Index beginnt. Ich habe alles versucht, was ich denken kann, um das zu isolieren, und der einzige Unterschied ist, dass es in einem Dienst ist und nicht als Befehlszeilen-App zum Beispiel ausgeführt wird.Warum entscheidet meine Sammlung, bei 0 statt 1 zu beginnen?

Wenn ich die Funktion debuggen bekomme ich auch eine "Eigenschaft Auswertung fehlgeschlagen" Nachricht, die ich nicht, wenn ich es auf meinem Komponententest ausführen.

Bitte beraten.

[EDIT]

Ich weiß, dass Arrays normalerweise von 0 beginne ich immer das heute angenommen habe, aber ich fand diesen Fehler und habe auch festgestellt, obwohl ich dachte, dass es von 0 gestartet wird, zeigt der Debugger, dass Es beginnt bei 1. Wenn ich durch die Sammlung stimme, erhält es den richtigen Wert in VS, aber nicht im Dienst.

[EDIT]

Ich verwende Microsoft.VisualBasic.Collection weil ich einen Schlüssel dagegen setzen können. Ein Wörterbuch-Objekt könnte auch verwendet worden sein, aber es wurde jetzt auf diese Weise eingerichtet und das ist, wie meine BLL-Basis-Klassen und andere zahlreiche Funktionen es lesen, so dass es nicht vorzuziehen ist, es zu ändern.

[SOLUTION]

ich Refactoring meinen Code ein dicitonary und Generic.KeyValuePair mit (String, Object), so dass ich nicht den Code neu schreiben würde, der die Schlüssel zugreift. Sollte jetzt gut funktionieren, da es Collections nicht so behandelt wie das Collec- tons-Objekt.

+0

Welche Art von Sammlung verwenden Sie? –

+0

Microsoft.VisualBasic.Collection – Middletone

Antwort

4

Standardmäßig beginnen .NET-Sprachen mit Array-Index 0, außer wenn Sie explizit angeben, um bei 1 für VB.NET zu beginnen.

Ich glaube nicht, gibt es eine Möglichkeit, diese Array-Konvention außerhalb von VB-Assemblies zu erzwingen, und als solche, wenn sie durch Windows-Remoting oder Webdienste gehen sie wieder auf die 0-basierte Indexkonvention zurückgesetzt.

Der Einfachheit halber empfehle ich, dass Sie Ihren gesamten Code umstrukturieren, um stattdessen 0-indizierte Sammlungen und Arrays zu verwenden.

aktualisieren

Basierend auf Ihre Kommentare sagten Sie, dass Sie das Microsoft.VisualBasic.Collection Objekt verwendet wird. Das Microsoft.VisualBasic.Collection-Objekt verwendet 1 als seinen Startindex. Verwenden Sie stattdessen ein ArrayList-Objekt oder besser noch ein generisches List-Objekt.

+0

Ich dachte immer, dass ich hatte. Als ich es debuggte, fand ich heraus, dass intern nur von 1 angefangen wurde, aber auf dem Dienst beginnt es bei 0.Ich wusste wirklich nicht, dass die Meise das bis heute getan hat, da ich vorher noch nie Probleme hatte. – Middletone

+0

Ich benutze die Sammlung, weil ich einen Schlüssel gegen das Objekt speichern möchte. Ich hätte ein Wörterbuch benutzen können, aber nicht und jetzt möchte ich nicht wirklich einen Ton-Code für diesen Zweck umgestalten, wenn das möglich ist. – Middletone

2

Alle Auflistungen in .NET Framework beginnen bei 0, ebenso Arrays. Immer.

Aus Ihren Kommentaren verwenden Sie einen speziellen Visual Basic-Auflistungstyp. Ich empfehle Ihnen, sich von dieser Gewohnheit zu verabschieden, da ich glaube, dass dieser Typ für die Interoperabilität mit VB6 gedacht ist.

+0

Sie sollten, aber aus irgendeinem Grund. NET fügt einen Eintrag im Objekt Sammlung und beginnt von 1 normal. – Middletone

+0

Insightful, das wusste ich nicht. – Middletone