4

我目前正在将一些 VB 源代码转换为 C#。虽然我知道有转换器可以自动执行此操作,并且我实际上可以使用这个特定的 dll 而无需重写它,但我只是部分地这样做,以便更好地理解 VB。与其期望写它,但它至少帮助我能够阅读它。

不过,在这样做时,我遇到了一些非常令人困惑的事情。以下代码片段是示例,但我在整个程序中都看到了它。

VB源代码:

Friend Function AllocateObjectNumber() As Long
    AllocateObjectNumber = _nextFreeObjectNumber
    _nextFreeObjectNumber += 1
    _objectAllocatedCount += 1
End Function

我翻译的 C# 代码:

    internal long AllocateObjectNumber()
    {
        cvNextFreeObjectNumber += 1;
        cvObjectAllocatedCount += 1;
        return cvNextFreeObjectNumber;
    }

我不明白的是 VB 使用的流控制。我知道AllocateObjectNumber += 1使用它代替return cvNextFreeObjectNumber,但是如果此行出现在两个变量的递增之前,那么该代码如何不被视为不可访问?根据我对C#的理解,这个方法的第一行会立即回到调用方法,整个方法基本上就是一个伪Property。

有什么有用的解释吗?

4

2 回答 2

8

VB 方法更类似于将值存储在临时变量中:

internal long AllocateObjectNumber()
{
    var nextNumber = _nextFreeObjectNumber
    cvNextFreeObjectNumber += 1;
    cvObjectAllocatedCount += 1;
    return nextNumber;
}

在 VB 中,function = value语法不做return- 所以之后的代码可以继续运行。当该方法结束时,您使用的值将成为首先调用它的任何内容的“返回”值。

您可以function = value在同一方法中多次使用该语法,作为在不同条件下返回不同结果的一种方式,而无需我在示例中使用的临时变量。

于 2013-04-18T15:15:36.633 回答
4

根据我对 C# 的理解,这个方法的第一行会立即返回调用方法

但它不是 C# 代码,而是 VB 代码。AllocateObjectNumber = _nextFreeObjectNumber不返回,它只是分配一个返回值。实际返回在方法的末尾。

大多数人实际上会编写与 C# 代码相同的 VB 代码,即Return显式使用。assign-to-method-name 样式是旧 VB 版本的残余,它是从函数返回值的唯一方法。在 VB.NET 中,您可以同时使用两者。

于 2013-04-18T15:19:02.433 回答