在Visual Basic中,在同一行使用冒号将两个语句放在一起是否被认为是不良实践?
使用冒号组合语句本身并没有什么不妥。这主要取决于上下文,只要它不会降低可读性,就没有问题。
作为一般规则,我避免使用冒号来做这个事情。我认为每行只有一个语句更易读。然而,这不是冒号特定的问题。在C#或C++中,我也避免使用分号做相同的事情。这只是个人喜好。
在适度的情况下,这是一个好的实践方式,因为有时通过连接两行可以增强可读性:
当这两行短小且琐碎无关时。
Option Compare Database: Option Explicit ''My favorite!
rsDataSet.Close: Set rsDataSet= Nothing
如果:
If...Then
这样的控制结构需要保持简洁。当设置断点时,您会感激自己保持简单。一般来说,我不建议这样做,因为它会使代码变得更加繁琐。
然而,对于简单的任务,这样做并没有什么问题。例如:
for i = 1 to 10: ProcessFoo(i): next
我觉得这样的一行代码很短,不会引起混淆。
我持相反意见。我不喜欢代码行过于密集。当代码没有组合在一起时,更容易浏览。
合并语句也使得创建长函数更加容易,而这些函数仍然可以适应单个屏幕。
这不是一个严重的错误,只是我不太喜欢。
我也不喜欢单行的If语句。
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
出于这个原因,我通常不在生产代码中使用冒号。然而,我会在论坛和其他地方发布的“复制/粘贴”代码中使用它们来提高简洁性。你的经验可能有所不同 :)
我知道这是一个非常古老的问题,但它是我在谷歌搜索结果中的第一个,所以我希望在这里加入一些评论。
有一种情况(正是导致我来到这里的原因),在这种情况下,这种方法不仅有用,而且是实现所需结果的唯一方法:即时窗口。您想要在即时窗口中执行的任何代码都必须在一行上。因此,为了在即时窗口中使用任何形式的Do、Case、For、While或With,您将需要使用冒号。
:
,但我发现它在处理这个错误时非常有用:http://support.microsoft.com/kb/327244 我以以下方式使用:
:Me.ComboBox.SelectedItem = Nothing : Me.ComboBox.SelectedItem = Nothing
我本可以将其放在两行上,但将其放在一行上使它更容易阅读,并且因为它只是一个重复的语句,所以这样做很有意义。 - вʀaᴎᴅᴏƞ вєнᴎєƞ我只在关闭记录集并将变量设置为 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 =”部分。
在我工作的大多数网站上,以及与我一起工作的大多数VB开发人员中,这被认为是不良实践。在我的想法中也是如此。如果我看到它,我会承认我几乎肯定会改变它。我说“几乎”是因为我承认有可能我会找到一段代码,那样看起来更好。虽然我不指望在我的一生中能看到它。
我也真的不喜欢单行**If
**s。
这两者都很可能是VGA(640x480)显示器时代的遗留问题;但现在这已经没有任何借口了。
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
个人觉得上述内容有点过头了。
Using pro As New Process() : With pro
...
End With
End Using