Der Operator With...End With ermöglicht es, den Zugriff auf Eigenschaften und Methoden eines einzelnen Objekts zu vereinfachen, sodass der Objektname nicht in jedem Ausdruck wiederholt werden muss. Alle Zugriffe innerhalb des Blocks beziehen sich auf das angegebene Objekt.
Beispiel:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Nutzen:
Frage: Kann man einen With-Block in einen anderen verschachteln? Was passiert mit den Zugriffen auf Eigenschaften und Methoden im inneren Block?
Antwort: Ja, eine Verschachtelung ist möglich. Aber innerhalb des inneren Blocks wird der Punktzugriff (.) relativ zum inneren Objekt interpretiert. Bei der Verwendung eines gleichen Eigenschaftsnamen kann es zu Mehrdeutigkeiten kommen.
With obj1 .Value = 10 With obj2 .Value = 20 ' Das ist obj2.Value, nicht obj1.Value End With End With
Geschichte
Im inneren With-Block wurden Eigenschaften mit dem gleichen Namen in verschiedenen Objekten verwendet, und der Entwickler erwartete, dass die Zuweisung den äußeren Objekt beeinflusst. Infolgedessen wurden die Daten nicht dorthin geschrieben, wo sie beabsichtigt waren, das Problem trat erst bei der Erstellung eines komplexen Berichts auf, als die Werte durcheinandergeraten waren.
Geschichte
Bei der Refaktorisierung des Codes wurden die End With-Blöcke verwechselt. In einem großen Codeabschnitt führte dies dazu, dass die Ausdrücke auf eine andere (bereits geschlossene) Objektinstanz verwiesen, anstatt auf die erwartete, was zu Ausführungsfehlern und schwer fassbaren Bugs führte.
Geschichte
In der Geschäftslogik wurde With für verschachtelte Sammlungen verwendet. Nach der Aktualisierung der Klassenstruktur wurde eine neue Eigenschaft mit dem gleichen Namen wie die Eigenschaften des inneren Objekts hinzugefügt, was zu einem Konflikt und einem Kompilierungsfehler führte, der aufgrund fehlender Unit-Tests in solchen Fällen unbemerkt blieb.