VB.NET可以创建具有新范围的内联块吗?

时间:2014-10-06 15:29:35

标签: c# .net vb.net scope c#-to-vb.net

在C#中,只需在代码周围放置一些大括号即可创建新的作用域。例如:

{
    Foo fooA = new Foo();
    fooA.doSomething();
    fooA.doSomethingElse();
}

{
    // Can't refer to fooA in here.
    Foo fooB = new Foo();
    fooB.doSomething();
    fooB.doSomethingElse();
}

VB.NET是否有办法在不使用任何保留字的情况下创建新范围?

2 个答案:

答案 0 :(得分:2)

你可以做到这一点(远不如C#代码那么优雅,但做同样的工作):

    If True Then
        Dim fooA As New Foo()
        fooA.doSomething()
        fooA.doSomethingElse()
    End If

    If True Then
        ' Can't refer to fooA in here.
        Dim fooB As New Foo()
        fooB.doSomething()
        fooB.doSomethingElse()
    End If

我不得不质疑为什么你会想要这样做...重构跳到我身边

答案 1 :(得分:1)

首先,“不使用任何保留字”的要求并不公平,因为VB.Net使用的是单词而不是大括号。换句话说,C#括号实际上只是伪装的单词(代币)。

也就是说,VB.Net不能完全按照C#的方式去做。您需要一些特定类型的代码块。例如,只需将代码包含在始终为真的If块中就足够了:

If True Then
    '...
End If

以上几乎完全相同,可能(未经测试)与C#几乎相同的IL,因为我希望编译器能够优化掉任何实际的布尔测试。

但是,在这种情况下,由于两个块几乎完全相同,所以我很想将这些代码抽象出来,无论如何都要使用它自己的方法。如果你真的想要,你甚至可以使用Action或Func委托来保存现有本地方法中的所有内容,并且仍然可以避免代码重复。