Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 比较相同的字符串返回false_.net_Vb.net_Io - Fatal编程技术网

.net 比较相同的字符串返回false

.net 比较相同的字符串返回false,.net,vb.net,io,.net,Vb.net,Io,我想编写一个函数来检查我的ip。如果我的ip是22.161.121.238或正在检查发出的异常它将休眠当前线程并再次开始检查 这就是代码: Private Sub CheckIp() Dim ip As String Dim mine As String = "22.161.121.238" Try Do Using wc As New Net.WebClient ip = System.Te

我想编写一个函数来检查我的ip。如果我的ip是
22.161.121.238
或正在检查发出的
异常
它将休眠当前线程并再次开始检查

这就是代码:

Private Sub CheckIp()
    Dim ip As String
    Dim mine As String = "22.161.121.238"
    Try
        Do

        Using wc As New Net.WebClient

            ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
        End Using


        If String.Equals(ip, mine) Then
            MessageBox.Show("2")
            Threading.Thread.Sleep(10000)
            Else
                MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
            End If
        End If

    Loop While ip = "22.161.121.238"


Catch ex As Exception
    Threading.Thread.Sleep(10000)
    CheckIp()

End Try

End Sub
我不知道为什么它不显示来自
MessageBox
的“2”。即使
ip
mine
相同,它也不会启动
Show
方法。你能告诉我为什么吗

编辑 启动按钮后得到的结果是(我添加了
@
以查看字符串的起始位置):


试试这个函数,原来的函数中有一些if/then逻辑不正确

Private Sub CheckIp()
Dim ip As String
Dim mine As String = "22.161.121.238"
Try
    Do

    Using wc As New Net.WebClient

        ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
    End Using


    If string.Compare(ip, mine) = 0 Then
        MessageBox.Show("2")
        Threading.Thread.Sleep(10000)
    Else
            MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
    End If


Loop While ip.Contains("22.161.121.238") 


Catch ex As Exception
Threading.Thread.Sleep(10000)
CheckIp()

End Try

End Sub

简单的答案是,您的两个字符串不相同。它们可能看起来相同,但您从web资源返回的字符串在字符串开头包含了不可见的(我选中了)

要确认,请检查返回字符串的各个字符的数值,特别是第一个字符

作为一种变通方法,您可以使用@henry的答案,该答案使用了一种不同的比较字符串的方法,它将忽略
u+feff
字符

或者,您可以显式地将其去掉以进行相等性检查:

If String.Equals(ip.Replace(ChrW(&HFEFF), String.Empty), mine) Then

但是,如果您是PHP页面的作者,您可能希望修复它,以便它不会首先返回
u+feff
字符。

您如何确定
ip
mine
是相同的?我猜它们实际上不是。你应该考虑使用CLAS,它不会神奇地解决问题,但它可以减轻它们。(这是一种更可靠的方法Stan,wny你不要像我一样启动visual studio,复制代码并测试值,你的假设是完全错误的。我应该早一点这样做,但我在第一篇文章中添加了gif。
String.Equals
检查二进制相等性(这似乎是OP想要的),其中as
String.Compare
检查排序顺序,并将受到当前区域性的影响。String.Equals不比较引用(与大多数Equals一样),因为String是一个类,但具有“值类型行为”因此Equals与==运算符相同。为什么对我的答案进行向下投票,这是100%正确的。Sstan,我在代码中测试了我的答案。您的评论对于OP想要的内容是完全错误的。
String。比较
可以返回逻辑排序相同但不一定相等的两个字符串的
0
。这是正确的吗?好的,我们同意这一点这两个字符串是不相同的。我的问题是OP认为这两个字符串是相同的,
String.Equals
在某种程度上被破坏了。你的回答进一步助长了这个错误的概念,仅仅是说他使用了错误的函数,并且暗指
Equals
没有按照他的想法做。你不这么认为吗nk解释为什么他的代码不起作用(字符串不相同)会更有用,这是OP的问题。然后,如果你想建议一个实际的解决方法,那么无论如何……这些类型的问题和答案现在很流行:-)在过去的几个月里,您已经回答了其中的一些问题+1 b因此,您必须使用string.compare函数:)OP不在乎它们在真正相等的定义中是否相等。@henry:这是您的解释。当我看到一个标题说:比较相同的字符串返回false,然后问题是你能告诉我为什么吗?我认为正确的答案是因为字符串实际上并不相同。如果OP需要解决办法,好的。但我绝不想给任何人一个错误的印象,即
String.Compare(s1,s2)==0
是检查相同字符串的有效方法。