With...End With演算子は、オブジェクトのプロパティやメソッドへのアクセスを簡素化し、各式でオブジェクトの名前を繰り返す必要がなくなります。ブロック内のすべての参照は指定されたオブジェクトを参照します。
使用例:
With myCustomer .Name = "イワノフ" .Balance += 1000 .LastPurchase = Now End With
利点:
質問: 1つのWithブロックを別の中に入れることは可能ですか?入れ子のブロック内でのプロパティやメソッドへの参照はどうなりますか?
応答: はい、ネストは可能です。ただし、内側のブロック内ではドット(.)を使用したアクセスは内側のオブジェクトに対して解釈されます。同じプロパティ名を使用するとあいまいさが生じます。
With obj1 .Value = 10 With obj2 .Value = 20 ' これは obj2.Value であり、obj1.Value ではありません End With End With
物語
ネストされたWithセクションで、異なるオブジェクトで同じ名前のプロパティが使用されており、開発者は代入が外側のオブジェクトに影響を与えると期待していました。その結果、データは期待しない場所に書き込まれ、複雑なレポートを生成する際に値が入れ替わる問題が現れました。
物語
コードのリファクタリング中にEnd Withブロックの終了を混同しました。大規模なコードフラグメントでは、表現が期待されたオブジェクトではなく、別の(既にクローズされた)オブジェクトのインスタンスを参照し始め、実行時エラーや難解なバグを引き起こしました。
物語
ビジネスロジックでは、ネストされたコレクションにWithが使用されていました。クラスの構造を更新した後、内部オブジェクトのプロパティと一致する名前の新しいプロパティが追加され、競合とコンパイルエラーが発生しました。この場合のユニットテストが存在しなかったため、問題は見過ごされました。