With...End With 操作符简化了对一个对象的属性和方法的访问,以便不在每个表达式中重复对象的名称。在块内部的所有引用都指向指定的对象。
使用示例:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
好处:
问题: 是否可以将一个 With 块嵌套在另一个块中?在嵌套块中对属性和方法的引用发生了什么?
答案: 可以进行嵌套。但在内部块中,以点(.)开头的引用将相对于内部对象进行解析。如果使用相同的属性名称,就会出现歧义。
With obj1 .Value = 10 With obj2 .Value = 20 ' 这是 obj2.Value,而不是 obj1.Value End With End With
故事
在嵌套的 With 区块中,不同对象的属性使用了相同的名称,开发者期望赋值会影响外部对象。结果数据写入了错误的位置,问题仅在生成复杂报告时显现,当值被混淆。
故事
在重构代码时混淆了 End With 块的结束。在较大的代码段中,这导致表达式开始引用另一个(已关闭的)对象实例,而不是预期的对象,这导致了执行错误和难以捕捉的 bug。
故事
在业务逻辑中,对嵌套集合使用了 With。在更新类结构后,增加了一个属性,其名称与内部对象的属性相同,导致冲突和编译错误,因缺乏单元测试而未被注意到。