【问题标题】:VB.NET Execution OrderVB.NET 执行顺序
【发布时间】:2013-04-11 18:57:24
【问题描述】:

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

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

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。

有什么有用的解释吗?

【问题讨论】:

  • 发生了,因为变量和返回函数是long类型,所以是值类型

标签: c# .net vb.net return


【解决方案1】:

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

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

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

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

【讨论】:

  • 不错的答案。 VB 的“将此函数的返回值设置为某个值”与 C# 的“使用此值返回”一开始可能会令人困惑。
  • 虽然正确,但 VB 代码风格是旧 VB6 时代的顽固派。它对大多数人来说是令人困惑的,不应该使用。现在应该使用 C# 中使用的标准“返回”语法。
  • 谢谢,这绝对解释了拥有这个功能是多么有用。翻译它的一个缺点是,虽然我看到 如何 在 VB 中做事,但它不一定解释 为什么 这样做。
  • 关于不同返回类型的问题:stackoverflow.com/questions/451025/vb-net-function-return。我同意这里的观点,return 声明是现代实践。将函数名称设置为一个值是令人困惑的,它需要额外的思考周期才能意识到它是函数返回值而不是某个类属性。
【解决方案2】:

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

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

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

【讨论】:

  • 很好的解释 - 在我看来,VB.NET 代码升级不良的 VB6 代码
  • @Matt 我不会说代码有什么问题。您当然可以使用单独的变量来存储返回值——我可能会这样做——但这可以说是不必要的。这更多的是风格问题。
  • 我在做这件事时发现的一件事是 VB 倾向于有多种方法来做同样的事情,而 C# 基本上只有 1 种(有时 2 种)方法来做这件事。这绝对是一个挑战。 :)
  • @KevenM 是的,这主要是由于 VB 的遗留问题,而 C# 是从头开始设计的。
  • @KevenM - 那只是因为 VB.NET 支持 VB6 语法或者它在 .NET 1.0 中支持 :-)
猜你喜欢
  • 2014-05-26
  • 2012-11-23
  • 2018-08-12
  • 2013-11-12
  • 2012-04-10
  • 1970-01-01
  • 2017-02-10
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多