使用冒号在Visual Basic中将两个语句放在同一行上是不好的做法?
答案 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
'================================================================