【问题标题】:Comparing strings in a loop using Is Operator使用 Is 运算符比较循环中的字符串
【发布时间】:2020-02-17 20:00:57
【问题描述】:

Is Operator 在比较两个字符串时可以正常工作,例如:

Dim str1 As String = "TagnameX"
Dim str2 As String = "TagnameX"

Dim strChk as boolean = str1 Is str2
'strChk returns True

但是当Substring 提取其中一个字符串时,它返回 false !如下:

Dim str1 As String = "t#1TagnameX"
Dim str1Extract As String = str1.Substring(3, 8)
Dim strArr() = {"Tagname1", "Tagname2", "TagnameX"}  

 For i = 0 To strArr.Length - 1
      If strArr(i) Is str1Extract Then
         MsgBox("TagnameX found!")
      else
         MsgBox("TagnameX was not found!")
      End If
 Next
'TagnameX was not found!

所以我在某些方面使用错了吗?感谢您的帮助! :)

【问题讨论】:

  • 关于主题here的几点说明

标签: vb.net


【解决方案1】:

Is-operator 返回两个引用是否相等:即两个变量是否引用内存中的相同位置。

第一个代码 sn-p 返回 True 因为对于文字字符串,.NET interns 重复而不是在内存中保留单独的相同副本,因此 str1 和 str2 在内存中引用相同的字符串。

第二个代码sn-p返回False,因为.NET并不一定要intern中间字符串,比如Substring返回的字符串。所以变量str 和strExtract 引用的不是同一个字符串。

您应该使用等号运算符= 来比较两个字符串的值。

【讨论】:

  • 感谢您提供的信息!我只是对在比较中使用 Is 运算符感兴趣!
【解决方案2】:

我不认为Is 操作符做你认为它做的事。

Is 运算符确定两个对象引用是否引用同一个对象。但是,它不执行值比较。

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/is-operator

而只是使用= 来比较字符串值。

If strArr(i) = str1Extract Then

【讨论】:

  • 虽然您所说的通常是有道理的,但 String Is 运算符已被重新定义以比较值,因此 OP 的示例是有道理的。重新定义可能只是在某些特定情况下不成立。
  • @laancelot 很有趣。文档没有提到字符串的具体行为。你有这方面的资源吗?
  • @PhilippGrathwohl 我应该在拥有它的时候链接它,但今天我不能把手放在它上面。如果我再次找到它,我会更新你。
  • @PhilippGrathwohl 仍然找不到我的来源,但没关系。实验表明Is 确实 比较引用。在初始化时,具有相同值的字符串变量将指向相同的内存单元。 You can "fool" the compiler by concatenating strings and avoid this comportment。我承认我更喜欢这个。
猜你喜欢
  • 2017-03-28
  • 2013-08-23
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2013-09-16
  • 2019-07-25
  • 2012-10-05
  • 1970-01-01
相关资源
最近更新 更多