【问题标题】:vb.net Interpolated Stringsvb.net 内插字符串
【发布时间】:2020-07-23 15:27:21
【问题描述】:

我被一位在硬编码我的数据库名称方面拥有多年经验的专业开发人员责备
好的,我明白了,我们有时会随身携带不良的编码习惯,直到我们学会正确的编码方式
我终于学会了使用插值字符串(个人认为它们并不漂亮)

我的问题涉及 GetDB 下面发布的两个 Sub 首先运行,然后从 GetDB 调用 HowMany
很抱歉,我的理由很明显,我认为 NewWord.db 在 GetDB 中被声明并在 HowMany 中工作,但没有相同的结构只是一个疯狂的猜测
注意 HowMany 中使用的 NO $ 或引号
两个 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()

【问题讨论】:

    标签: vb.net string-interpolation


    【解决方案1】:

    第二种方法是对字符串插值的荒谬和毫无意义的使用。将文字 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 中错过单引号或空格等的次数,因为他们无法阅读那里的杂乱代码。就个人而言,我很少在同一个表达式中使用两个连接运算符,从不使用三个。我会这样做:

    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}"
    

    我仍然可以在字符串插值上使用String.Format 的地方是,如果一个值被插入到多个位置和/或文本模板和/或表达式很长的地方,以便我可以将整个内容分成多行,例如

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

    【讨论】:

    • 好的,那么我在哪里存储数据库名称以及 SQLite 文件的文件类型?我在应用程序首次运行时创建了数据库和表我知道保存文件的唯一另一种方法是将 txt 文件写入某个地方,这是相同的不安全方式配置文件在哪里?
    • “我在哪里存储数据库名称”。这完全取决于你。我在答案中提供了一个建议,但这确实超出了这个问题的范围。与此问题相关的只是您将其存储在应用程序可执行文件之外,以便无需重新编译应用程序即可对其进行修改。
    • “SQLite 文件是什么类型的文件”。这完全超出了这个问题的范围。如果你想学习使用 SQLite,那么有很多地方可以做到这一点。这与字符串插值无关。
    【解决方案2】:

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

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

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

    第一个 sub 甚至不使用连接。该代码中的连接字符串是文字字符串。它不会将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
    

    第二个 sn-p 从 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-informationWhere to store Connection String

    【讨论】:

    • NewWord.db 是一个字符串数据库名称我同意 HowMany 不是描述性的专注于代码会抑制我的命名我出错的地方是我不需要打开与 DisplayGridCount 的连接正如你指出的那样我确实学习了如何将数据库名称存储在 App.config 中并检索它这些天我看不到感谢按钮,所以感谢 TestConnection SUB MY GetDB Sub 将记录从 DB 读取到数据网格视图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多