在Visual Basic中使用冒号将两个语句放在同一行

23

在Visual Basic中,在同一行使用冒号将两个语句放在一起是否被认为是不良实践?


2
我过去在vb6中习惯将声明和初始化放在同一行,但这个问题在vbn中得到了修复。 - Craig Gidney
12个回答

23

使用冒号组合语句本身并没有什么不妥。这主要取决于上下文,只要它不会降低可读性,就没有问题。

作为一般规则,我避免使用冒号来做这个事情。我认为每行只有一个语句更易读。然而,这不是冒号特定的问题。在C#或C++中,我也避免使用分号做相同的事情。这只是个人喜好。


8
+1 同意。我做了十多年的VB编程,甚至不知道你可以把语句放在同一行,用分号隔开。除非我的电脑上的垂直滚动条坏了,否则我不会这样做。 - MusiGenesis

21

在适度的情况下,这是一个好的实践方式,因为有时通过连接两行可以增强可读性:

  • 当这两行短小且密切相关时
  • 当这两行短小且琐碎无关时。

Option Compare Database:  Option Explicit   ''My favorite!
rsDataSet.Close:          Set rsDataSet= Nothing

如果:

  • 会降低可读性。
  • 会增加调试复杂度。像 If...Then 这样的控制结构需要保持简洁。当设置断点时,您会感激自己保持简单。
  • 会影响未来的编辑。通常情况下,您希望保持代码块的可移植性。尝试将代码块移动或重新组织通常会受到代码最小化的限制。

13

一般来说,我不建议这样做,因为它会使代码变得更加繁琐。

然而,对于简单的任务,这样做并没有什么问题。例如:

for i = 1 to 10: ProcessFoo(i): next

我觉得这样的一行代码很短,不会引起混淆。


9

我持相反意见。我不喜欢代码行过于密集。当代码没有组合在一起时,更容易浏览。

合并语句也使得创建长函数更加容易,而这些函数仍然可以适应单个屏幕。

这不是一个严重的错误,只是我不太喜欢。

我也不喜欢单行的If语句。


8
对我来说,你不应该说“永远不要这样做”,而应该说“如果你这样做,可能会出现这样那样的问题。”然后权衡一下利弊。优点是简洁/代码行数少。有时这可以帮助提高可读性。例如,有些人用它来进行vb.Net声明:
Dim x As Long: x = 1

或者等待循环:

Do Until IE.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop

当然,你也可以让某人感到很难受:
Public Sub DoYouKnowWhatThisDoes()
    MsgBox Example
End Sub

Private Function Example()
    Const s$ = "078243185105164060193114247147243200250160004134202029132090174000215255134164128142"
    Const w% = 3: Const l% = 42: Dim i%, r$: For i = 1 To l Step w: r = r & ChrW$(Mid$(s, i, w) Xor Mid$(s, i + l, w)): Next: Example = r
End Function

另一个你可能不希望使用此方法的实际原因是断点。断点只能按行设置。所以如果你有多个东西在同一行上执行,你就不能隔离第二个东西。它会在第一个语句停止。(这也是一些人不喜欢单行if语句的原因之一。)它只是稍微复杂了一点调试。

出于这个原因,我通常不在生产代码中使用冒号。然而,我会在论坛和其他地方发布的“复制/粘贴”代码中使用它们来提高简洁性。你的经验可能有所不同 :)


5

我知道这是一个非常古老的问题,但它是我在谷歌搜索结果中的第一个,所以我希望在这里加入一些评论。

有一种情况(正是导致我来到这里的原因),在这种情况下,这种方法不仅有用,而且是实现所需结果的唯一方法:即时窗口。您想要在即时窗口中执行的任何代码都必须在一行上。因此,为了在即时窗口中使用任何形式的Do、Case、For、While或With,您将需要使用冒号。


1
再次提出老问题,但由于这是一个新答案,我会发表一个新评论。我很少在代码中使用:,但我发现它在处理这个错误时非常有用:http://support.microsoft.com/kb/327244 我以以下方式使用:Me.ComboBox.SelectedItem = Nothing : Me.ComboBox.SelectedItem = Nothing 我本可以将其放在两行上,但将其放在一行上使它更容易阅读,并且因为它只是一个重复的语句,所以这样做很有意义。 - вʀaᴎᴅᴏƞ вєнᴎєƞ

4

我只在关闭记录集并将变量设置为 null 时使用它。我认为一行比两行更多,可以在屏幕上显示更多的代码行,而且不会影响可读性。

我见过它在简单的选择案例中使用,如下面的示例,但这就是我会使用的范围。

 Select Case success
      Case ERROR_FILE_NO_ASSOCIATION: msg = "no association"
      Case ERROR_FILE_NOT_FOUND: msg = "file not found"
      Case ERROR_PATH_NOT_FOUND: msg = "path not found"
      Case ERROR_BAD_FORMAT:     msg = "bad format"

来自http://vbnet.mvps.org/index.html?code/system/findexecutable.htm

即使如此,我也会排列好“msg =”部分。


2
你是否曾经考虑过继承你代码的人?你有没有想过,如果我在VBE IDE上的msg =“no association”行上设置断点,会导致每个情况下都进入中断模式? - onedaywhen
2
你的评论在我曾经将两个语句放在同一行的唯二情况下都是无关紧要的。 - Tony Toews
2
<耸肩> 那我们就同意不同意。 - Tony Toews
1
顺便说一下,在维护遗留的VBA代码时,我经常不得不在Case语句上设置断点,所以这是基于与其他开发人员合作的经验而产生的实用提示,其中一些人喜欢单行语句。 - onedaywhen
4
你的反对意见对于这个小问题来说过于强烈。但你愿意怎么做就怎么做吧。 - Tony Toews
显示剩余5条评论

4

在我工作的大多数网站上,以及与我一起工作的大多数VB开发人员中,这被认为是不良实践。在我的想法中也是如此。如果我看到它,我会承认我几乎肯定会改变它。我说“几乎”是因为我承认有可能我会找到一段代码,那样看起来更好。虽然我不指望在我的一生中能看到它。

我也真的不喜欢单行**If**s。

这两者都很可能是VGA(640x480)显示器时代的遗留问题;但现在这已经没有任何借口了。


3
我在我工作的任何公司都没有看到官方文件提到过这一点。但我认为过度使用冒号会使您的代码变得难以阅读和维护。
我有时候也会使用冒号,比如在最近的一个项目中检查取消操作:
If _bCancel Then Status = CancelProcess() : Return Status

把这个放进去比替代的IF块更容易阅读我的代码。

但是有时候会过度使用,最近我接手了一个项目,里面充斥着过多使用冒号的例子:

    Select Case GetStringValue(Index).Trim.ToLower
        Case "yes", "y" : GetBooleanValue = True
        Case "no", "n" : GetBooleanValue = False
        Case Else : GetBooleanValue = Nothing
    End Select

个人觉得上述内容有点过头了。


2
我认为你可以做得更糟,至少它可以在屏幕上作为一行适合显示。 - Paul C
http://dilbert.com/strip/1994-06-08 ;) - cxw

1
我喜欢这个。
Using pro As New Process() : With pro

        ...

    End With
End Using

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接