【问题标题】:utterly weird behavior in basic string comparison基本字符串比较中完全奇怪的行为
【发布时间】:2009-08-05 19:01:24
【问题描述】:

这对我来说没有任何意义。一定是错误的或非常明显的。

切片和切块后,我在 vb.net 中得到了 2 个具有以下值的变量:

strTag = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"
tmp    = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"

比较变量会得出错误:

strTag = tmp ' ==> false

直接比较这些值会得到一个正确的结果:

"&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;" = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;" ' ==> true

两者都是字符串,我尝试了各种东西:string.compare,string.equals,还有正则表达式等。所有其他具有类似结构的字符串都可以完美运行,只是不是,只有不是

"vermittler_person_Name"

在中间......有什么想法吗?

【问题讨论】:

  • 这不是逐字代码。直接分配它们可以正常工作。前 2 行是字符串操作的结果,从 watch-value 字段中复制而来...(我不想发布太多代码。)
  • 第一个是这样组成的 strTag = openingTag & "" & tags(i) & "" & closingTag 第二个是来自前景的相当长的字符串MailItem.HTMLbody

标签: .net vb.net string


【解决方案1】:

我强烈怀疑虽然两个显示的字符串相等,但内部数据相等。那里可能有任意数量的非打印字符。

如果您能够重现这一点,我建议您查看违规字符串的每个字符的 Unicode 值。如果我是对的,出于显而易见的原因,我们将无法通过仅包含可见字符的 SO 帖子重现此内容。

【讨论】:

  • 它们不会出现在记事本++或类似的不可打印字符中吗?但无论如何,好点!我会尝试可重现的代码并马上回来。谢谢!
  • @handsomeGun:您如何将它们复制到记事本++ 中?如果它来自调试器,那很可能没有将它们放入剪贴板。
  • 好吧,它们通常被复制为“奇怪”字符。但你是正确的! .length 显示的差异为 1。所以我将遍历字符串以发现违规字符。 (它并没有以同样的方法与其他几十个人一起这样做,这就是为什么我如此震惊..)谢谢!
【解决方案2】:

您可以检查两个字符串的长度以查看它们是否相同,或者将它们都转换为相同的大小写(大写或小写)以查看是否导致差异

【讨论】:

    【解决方案3】:

    我无法重现这个问题。我尝试了以下代码 VS2008 RTM 并且值相同的是 True

    Sub Main()
        Dim strTag = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"
        Dim tmp = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"
        Dim same = strTag = tmp
        Stop
    End Sub
    

    您能否提供您的问题的可运行示例代码?包括 Visual Studio 版本和选项(Strict、Explicit 等...)

    【讨论】:

      【解决方案4】:
      dim strTag as String 
      dim tmp as String 
      
      strTag = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"
      tmp = "&lt;#<span class=SpellE>vermittler_person_Name</span>&gt;"
      
      Console.WriteLine(strTag = tmp) 'prints True
      

      你能发布代码吗,它在哪里进行比较?

      编辑:在进行比较之前,将内容打印到控制台以查看它们是否不同

      Console.WriteLine(strTag)
      Console.WriteLine(tmp)
      

      【讨论】:

        【解决方案5】:

        我没有 VB/.NET 经验,但这听起来与 java 中的行为相似。

        在java中,你声明了两个字符串对象。

        String a = new String("aa");
        String b = new String("aa");
        

        a.equals(b) 将返回 truea==b 将返回 false

        "aa"=="aa" 也将返回 true。

        这是因为"aa" 是文字字符串(类似于原语),而ab 是内存中不同的两个不同对象。

        VB/.NET 行为可能类似(我不知道)。

        【讨论】:

        • 对于 VB.net 中的字符串不正确,但对于大多数引用类型都是正确的。
        猜你喜欢
        • 1970-01-01
        • 2021-09-07
        • 2011-09-13
        • 2011-09-18
        • 2011-10-07
        • 2011-04-07
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        相关资源
        最近更新 更多