在 VBA 中,有一个很酷的功能,称为 With
语句,它可以让您设置代码块的全局范围。这对于更改对象的多个字段和调用方法很有用。
这是一个例子:
With Forms!main
.Filter = "tel IS NOT NULL"
.FilterOn = True
.Requery 'This is a method!
If .Recordset.RecordCount> 3 Then
.BackColor = "Red"
End If
End With
在此示例中,所有以 .
开头的语句均引用 Forms!main
的字段和方法。
我还没有在任何现代语言(Javascript、C#、Python)中遇到过这样的功能,我想知道这是否有原因?
最佳答案
有一篇有用的维基百科文章将其描述为 method cascading ,基本上是 syntactic sugar 的一种类型。文章包括dart , pascal和 smalltalk与具有此功能的其他语言一样。
它也是用 Javascript 编写的,但是 note那:
...using with is not recommended, and is forbidden in ECMAScript 5 strict mode
const obj = {a: 1, b: 2}
with (obj) {
const k = a + b; // no need for a .
console.log(k)
}
根据此 answer,它也包含在 C# 9.0 中- 阅读所有答案以了解上下文。
另一个有趣的帖子是 this one这对我回答“为什么”这个功能没有更广泛的问题有一定的帮助。
“糖”可能会变得“太甜”,例如:
k = 99
With foo
With .bar
With .baz
If Not .qux Is Nothing Then
k = 4
End If
End With
For i = 1 to .NumberOfThings
k = k + i
Next i
End With
.DoAllTheThings(k, SomeOtherVariable)
End With
与您更简洁和可读的示例相比,突然使用 With
不再那么有用。我们可以看到该功能引起了争议(由于过度使用),这就是它尚未真正成为主流的原因。
关于其他语言中的 VBA With 语句等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71465816/