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

时间:2009-09-11 15:42:49

标签: vb.net vba vb6

使用冒号在Visual Basic中将两个语句放在同一行上是不好的做法?

12 个答案:

答案 0 :(得分:22)

使用冒号组合语句没有任何内在错误。它实际上取决于上下文,但只要不降低可读性,就没有任何问题。

作为一般规则,我为此避免使用冒号。我发现每行有一个语句更具可读性。然而,这不是结肠特定问题。我避免在C#或C ++中使用分号进行相同的操作。这只是个人偏好。

答案 1 :(得分:17)

这是一种适度的好习惯,因为有时通过连接两行来增强可读性:

  • 线条短而紧密 相关
  • 当线条短而且无关紧要时

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

如果出现以下情况,请不要这样做:

  • 这会伤害可读性。
  • 使调试变得复杂。控制结构如If...Then需要保持清洁。在设定断点时,你会很高兴你保持简单。
  • 它会影响未来的编辑。通常你想保持部分便携。尝试最小化代码很容易阻碍移动或重构代码块。

答案 2 :(得分:11)

一般来说,我建议反对它,因为它会使代码变得更加繁忙。

但是,对于简单的任务,它没有任何问题。例如:

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

我认为像这样的一条线很短,不会引起混淆。

答案 3 :(得分:9)

我会接受另一面。我不喜欢密集的代码行。当没有组合线时,更容易浏览代码。

组合语句还可以更轻松地创建仍然适合单个屏幕的长函数。

这不是一个大罪,我只是不喜欢它。

我也不喜欢一行 If 语句。

答案 4 :(得分: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

您可能不想使用此方法的另一个实际原因是断点。断点只能由该行设置。所以,如果你在同一条线上执行了几件事,你就无法隔离第二件事。它将在第一个声明中停止。 (这也是一些人不喜欢单行ifs的原因之一。)这只会使调试变得复杂一点。

出于这个原因,我通常不会在生产代码中使用冒号。但是,我确实使用它们来改善我在论坛和其他地方发布的“复制/粘贴”代码的简洁性。 YMMV:)

答案 5 :(得分:5)

我意识到这是一个非常古老的问题,但这是我在谷歌搜索中的第一个结果,所以我希望我可以原谅我在这里玩。

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

答案 6 :(得分:4)

在我工作过的大多数网站中被视为不良做法。和我工作过的大多数VB开发人员一样。在我脑海里。如果我看到它,我会承认我几乎肯定会改变它。我说“差不多”因为我承认我有可能找到一段看起来更好的代码。不过,我不希望在我的一生中看到它。

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

两者都很可能是VGA(640x480)显示器时代的宿醉;这些日子不是借口。

答案 7 :(得分:4)

我只是在使用它时,我正在使用记录集并将变量设置为空。我认为一行而不是两行给了我更多的代码行,并且不会降低可读性。

我已经看到它用于简单的选择案例,如下所示,但这将是我想去的。

 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 =”部分排成一行。

答案 8 :(得分: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

我个人觉得上面的内容有点多了。

答案 9 :(得分:1)

我喜欢这个

Using pro As New Process() : With pro

        ...

    End With
End Using

答案 10 :(得分:0)

我在使用继承或实现接口时看到它在类声明中使用:

Public Class DerivedClass : Inherits BaseClass
   ...
End Class

但与其他人一样,我也不赞成使用它。

克里斯

答案 11 :(得分:-1)

这个问题的答案是否定的。除了简单的答案外,任何超越否的东西都是纯粹的主观和浪费。下面是我浪费的打字。

你是某种奴隶吗?你爱怎么做就怎么做。你是宇宙的中心而不是StackOverflow的陌生人。如果您在公司工作,问题就是静音,因为编码风格已经定义并且完全不受您的控制。对于自己而言,在这个宇宙中永远都会永远关注你的代码。

我会选择A而不是B.显然,这显示了不使用结肠的结肠的目的。这是为了节省空间。下面节省空间并使代码更具可读性。保持简单愚蠢。三元一样吗? :用法。如果代码本质上很复杂,那么就不应该考虑使用冒号,单行代码或其他三元组。

'================================================================
'A
If somevalue1 = 0 Then AddLogTry("True") Else AddLogFalse("False")
If somevalue2 = 0 Then AddLogTry("True") Else AddLogFalse("False")
If somevalue3 = 0 Then AddLogTry("True") Else AddLogFalse("False")
'================================================================

'================================================================
'B
If somevlaue1 = 0 Then
  AddLogTrue("True")
Else
  AddLogFalse("False")
EndIf

If somevlaue2 = 0 Then
  AddLogTrue("True")
Else
  AddLogFalse("False")
EndIf

If somevlaue3 = 0 Then
  AddLogTrue("True")
Else
  AddLogFalse("False")
EndIf
'================================================================