比较字符串无法正常工作 vb.net
Comparing strings not working properly vb.net
我正在尝试比较 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
编辑
显然字符串中有一个空字符,我需要以某种方式将其删除
您手表 window 中的表达式已过时,如禁用颜色和 Refresh/Recycle 图标所示。单击该图标,将重新计算表达式并更新结果:
模仿你所拥有的,注意第一个表达式陈旧且错误。第二个是 refresh/reevaluated 并报告了正确的结果。一旦执行一行代码,监视表达式将被标记为 stale/not 已更新。
使用 NET return 函数的更好方法是使用局部变量并 Return
它。本地变量允许您通过悬停鼠标轻松查看结果:
变量可以超出范围,但不能过时。
编辑 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
注意是函数;它 return 是读入缓冲区的字符数。而不是不会删除 NUL
的 Trim
,应该使用 return(如果不是 stringbuilder)来获取指定的字符数。如果使用字符串缓冲区,trim 读取的字符数:
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()
您仍然可以根据字符串的大小检查函数 return。
您可以完全跳过 GetPrivateProfileString
并使用流 reader 自己读取文件。它应该比 PInvoke 更快,但至少使用起来不那么复杂。
我正在尝试比较 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
编辑
显然字符串中有一个空字符,我需要以某种方式将其删除
您手表 window 中的表达式已过时,如禁用颜色和 Refresh/Recycle 图标所示。单击该图标,将重新计算表达式并更新结果:
模仿你所拥有的,注意第一个表达式陈旧且错误。第二个是 refresh/reevaluated 并报告了正确的结果。一旦执行一行代码,监视表达式将被标记为 stale/not 已更新。
使用 NET return 函数的更好方法是使用局部变量并 Return
它。本地变量允许您通过悬停鼠标轻松查看结果:
变量可以超出范围,但不能过时。
编辑 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
注意是函数;它 return 是读入缓冲区的字符数。而不是不会删除 NUL
的 Trim
,应该使用 return(如果不是 stringbuilder)来获取指定的字符数。如果使用字符串缓冲区,trim 读取的字符数:
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()
您仍然可以根据字符串的大小检查函数 return。
您可以完全跳过 GetPrivateProfileString
并使用流 reader 自己读取文件。它应该比 PInvoke 更快,但至少使用起来不那么复杂。