VBA With 语句等同于其他语言

VBA With statement equivalent in other languages

在 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, basically a type of syntactic sugar. The article includes , and 与具有此功能的其他语言一样。

它也在 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 中 - 阅读所有上下文的答案。

另一个有趣的 post 是 this one,它与我对 'why' 这个问题的回答有一些相似之处。此功能并不广泛。

'sugar'可以得到'too sweet'例如:

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 并没有那么有用。我们可以看到该功能引起了争议(由于 over-use),这就是它没有真正成为主流的原因。