vb.net 内插字符串

vb.net Interpolated Strings

我被一位拥有多年硬编码数据库名称经验的专业开发人员训斥
好的,我明白了,在我们学会正确的编码方式之前,我们有时会带着不良的编码习惯
终于学会用Interpolated Strings了(个人觉得不太好看)

我的问题涉及下面发布的两个 Sub,首先运行 GetDB,然后从 GetDB 调用 HowMany
抱歉,我的理由很明显,我认为 NewWord.db 在 GetDB 中声明并在 HowMany 中工作,但没有相同的构造只是一个疯狂的猜测
注意 HowMany
中没有使用 $ 或引号 两个 Sub 都产生了预期的结果

问题是为什么两个语句不需要构造相同?

    Public Sub HowMany()
    'Dim dbName As String = "NewWord.db"
    Dim conn As New SQLiteConnection("Data Source ='{NewWord.db}';Version=3;")
    tot = dgvOne.RowCount ' - 1
    tbMessage.Text = "DGV has " & tot.ToString & " Rows"
End Sub

Private Sub GetDB()

    Dim str2 As String
    Dim s1 As Integer
    'Dim dbName As String = "NewWord.db"
    Using conn As New SQLiteConnection($"Data Source = '{"NewWord.db"}' ;Version=3;")
        conn.Open()

第二种方法是对字符串插值的荒谬且毫无意义的使用。将文字 String 插入文字 String 可能有什么意义?重点是您可以插入在 运行 时间确定的值。第二个代码相当于使用:

"Data Source = '" & "NewWord.db" & "' ;Version=3;"

这有什么意义?这个想法是你在 运行 时间从某个地方检索你的数据库名称,例如您的配置文件,然后将其插入模板 String,例如

Dim dbName = GetDbNameFromExternalFile()

Using conn As New SQLiteConnection($"Data Source = '{dbName}' ;Version=3;")

现在用户可以在部署应用程序后编辑该外部文件来更改数据库名称。他们怎么能更改您代码中的名称?

需要说明的是,字符串插值只是对 String.Format 方法的本地语言支持。你可以看到,如果你犯了一个错误,就会产生一个异常,这个异常将引用 String.Format 方法。反过来,String.Format 是一种使将多个值放入长模板的代码比使用多个连接运算符更容易阅读的方法。

有很多引号和符号会使代码难以阅读且容易出错。我已经记不清有多少人因为看不懂那里的乱码而在 String 中漏掉了单引号或 space 之类的东西。就个人而言,我很少在同一个表达式中使用两个串联运算符,而从不使用三个。我会这样做:

Dim str = "some text" & someVar

但我很少这样做:

Dim str = "some text" & someVar & "some more text"

而且我永远不会这样做:

Dim str = "some text" & someVar & "some more text" & someOtherVar

在字符串插值之前,我会使用 String.Format:

Dim str = String.Format("some text{0}some more text{1}", someVar, someOtherVar)

现在一般都会用字符串插值:

Dim str = $"some text{someVar}some more text{someOtherVar}"

如果一个值被插入到多个位置 and/or 我仍然可以使用 String.Format 字符串插值,其中文本模板 and/or 表达式很长,因此我可以将整个事情分成多行,例如

Dim str = String.Format("some text{0}some more text{1}yet more text{0}",
                        someVar,
                        someOtherVar)

我不知道 NewWord.db 是什么,所以我做了一个 class 来表示它。

Public Class NewWord
    Public Shared Property db As String = "The db Name"
End Class

HowMany 对你的潜艇来说不是一个很好的名字。尝试使用更具描述性的名称。

第一个子甚至不使用连接。该代码中的连接字符串是文字字符串。它不会将 NewWord.db 视为变量。您不会注意到这一点,因为您从不尝试打开连接。在我的版本中,您使用 Debug.Print.

检查连接字符串

我更改了最后一行以使用和插入字符串。没有必要在 tot 上调用 .ToString

Private Sub DisplayGridCount()
    Dim conn As New SQLiteConnection("Data Source ='{NewWord.db}';Version=3;")
    Debug.Print(conn.ConnectionString)
    Dim tot = DataGridView1.RowCount
    TextBox1.Text = $"DGV has {tot} Rows"
End Sub

第二个代码段以 2 个未使用的变量开始。我删除了它们。同样,Debug.Print 显示 2 个字符串的差异。

Private Sub TestConnection()
    Using conn As New SQLiteConnection($"Data Source = '{NewWord.db}' ;Version=3;")
        Debug.Print(conn.ConnectionString)
        'conn.Open()
    End Using
End Sub

关于存储连接字符串的位置,请参阅 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/protecting-connection-information and Where to store Connection String