【问题标题】:Comparing strings not working properly vb.net比较字符串无法正常工作 vb.net
【发布时间】:2015-12-03 04:44:08
【问题描述】:

我正在尝试比较 2 个字符串(KeyCode 和 SerialN) 我尝试了很多不同的方法......但正如你在我的打印屏幕中看到的那样,= 或 Equals 都不起作用。

你能告诉我有什么问题吗?

Private Function VerificaKeyCode(SerialN As String) As Boolean
        Dim snEsq As Integer
        Dim snDir As Integer
        Dim KeyCode As String
        Dim buffer As String
        Dim ind As Short

        VerificaKeyCode = False
        buffer = Space(255)
        For ind = 1 To 5
            'UPGRADE_WARNING: App property App.EXEName has a new behavior. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6BA9B8D2-2A32-4B6E-8D36-44949974A5B4"'
            GetPrivateProfileString(My.Application.Info.AssemblyName, "HD" & ind, "", buffer, Len(buffer), My.Application.Info.DirectoryPath & "\ServerHD.ini")
            KeyCode = Trim(buffer)
            If KeyCode <> "" Then
                VerificaKeyCode = KeyCode.Equals(SerialN)
                VerificaKeyCode = CBool(KeyCode = SerialN)
                If VerificaKeyCode Then Exit Function
            End If
        Next ind
    End Function

编辑

显然字符串中有一个空字符,我需要以某种方式将其删除

【问题讨论】:

  • 不要使用屏幕截图,请将代码贴出来,好吧,代码在这里
  • 我猜你是在错误的执行行。您的变量仍然具有上一条语句分配的值。执行当前行,我们的应该是真的。
  • = 或等于应该提供相同的结果;但是您必须确保两个输入相同(它 = 或等于说它们不相同是因为它们不是)。您的变量可能不相同的原因有多种;例如,您正在修剪其中一个而不是另一个(在第一次比较中,您仅将 ToUpper 应用于其中一个变量)。只要保持一致并确保对所有变量应用相同的修改。例如: .Trim().ToUpper() 到字符串比较中涉及的所有变量听起来不错。
  • 当前行不正确...所有这些行都返回错误
  • 多次设置结果不会改变任何东西。因此,您使用 VerificaKeyCode = &lt;...&gt; 您会根据最新检查继续设置它。对于函数,您应该改用Return。这是一个关于如何返回多个变量检查​​的示例:Return (KeyCode = teste1 Or teste2 = teste1)

标签: vb.net equals equals-operator


【解决方案1】:

您的监视窗口中的表达式已过时,如禁用的颜色和刷新/回收图标的存在所示。单击该图标,将重新计算表达式并更新结果:

模仿你所拥有的,注意第一个表达是陈旧和错误的。第二个已被刷新/重新评估并报告正确的结果。一旦你执行了一行代码,watch 表达式就会被标记为过时/未更新。


使用 NET 返回函数的更好方法是使用局部变量和Return。本地变量允许您通过悬停鼠标轻松查看结果:

变量可以超出范围,但不能过时。


Edit 4 或 5 显示,虽然 watch 表达式 陈旧,所以我们在图片中看到的既不能证明也不能证明字符串不匹配,这显然是 VB6 -> .NET翻新(注意 102 个警告)。

我们看不到GetPrivateProfileString 的声明,但它的使用至少不是最理想的。

<DllImport("kernel32.dll", SetLastError:=True)>
Shared Function GetPrivateProfileString(appname As String,
                                        keyname As String, def As String,
                                        sbuffer As StringBuilder, 
                                        nSize As Int32,
                                        strFile As String) As Integer
End Function

注意它是一个函数;它返回读入缓冲区的字符数。而不是Trim 不会删除NUL,应该使用返回(如果不是字符串生成器)来获取指定的字符数。如果您使用字符串缓冲区,请修剪到读取的字符数:

Dim n As Int32 = GetPrivateProfileString(...)
KeyCode = buffer.Substring(0, n)

StringBuilder 应该为你做这件事:

Dim buffer As New StringBuilder(255)
...
Dim n As Int32 = GetPrivateProfileString(..., buffer, buffer.Capacity)
KeyCode = buffer.ToString()

您仍然可以根据字符串的大小检查函数返回。


您可以完全跳过GetPrivateProfileString 并使用流阅读器自己读取文件。它应该比 PInvoke 更快,但至少使用起来不那么复杂。

【讨论】:

  • 我已经清理了我的烂摊子并放了一个新的打印屏幕......这是一个非常奇怪的“错误”。打印中的所有灰度值都是刷新值......但它只显示一个由于某种原因“新鲜”
  • 当前图像仍然显示手表表达式过时;将结果存储到本地 var 并查看 that
  • 我已经为变量添加了一个监视,以便您可以看到它返回 false。我认为这是我能做的最好的。也许它与不同的字符串编码有关?
  • 在两个变量上使用 Dim snChars = serialN.ToCharArray() 来查看是否正确 - 只需将鼠标悬停在变量上并单击 +。看看有没有相同的
  • 根据你的建议,我发现有一个不可见的字符,我已经将它转换为一个咬合数组,发现它的值为 0(可能是 \0 表示字符串结束)我该如何清洁它?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多