Dim Str1 As String = “Tmp”
Dim Str2 As String = “Tmp”
Dim Str3 As String = New String(CType(“Tmp”, Char()))
Console.WriteLine(Str1 = Str2) ’ => True 两个对象的内容相同
Console.WriteLine(Str1 Is Str2) ’ => True 两个引用指向同一个对象
这段代码里,虽然Str1和Str2 2个字符串内容都是"Tmp",但是字符串是指针,他们2个指针数不一定就是1个指针把???
哪为什么Str1 Is Str2 就是True么????
.NET 的字符串保存在一个公共缓冲区. 相同的字符串,无论出现在哪,它们都是指向的都是同一个东西:同一个缓冲区的值.
并不是这样,只有编译器能够识别的常量才放在字符串常量池里。
看如下代码:
Visual Basic code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
Imports System
Public Class Test
Public Shared Sub Main()
Dim str1 As String = Mid(“hello”, 1, 2)
Console.WriteLine(str1)
Dim str2 As String = “he”
Console.WriteLine(object.ReferenceEquals(str1, str2))
Console.WriteLine(str1 = str2)
Dim str3 As String = “he”
Console.WriteLine(object.ReferenceEquals(str2, str3))
End Sub
End Class
he
False
True
True
显然,三个字符串都是he
但是str2是运行时计算的,所以它的引用和另外两个不同,而两个常量的引用(相当于地址)相同
而使用等号比较,因为都是he,所以相同。
NET 的字符串保存在一个公共缓冲区. 相同的字符串,无论出现在哪,它们都是指向的都是同一个东西:同一个缓冲区的值.
并不是这样,只有编译器能够识别的常量才放在字符串常量池里。
看如下代码:
Visual Basic code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
Imports System
Public Class Test
Public Shared Sub Main()
Dim str1 As String = Mid(“hello”,www.973949.com 1, 2)
Console.WriteLine(str1)
Dim str2 As String = “he”
Console.WriteLine(object.ReferenceEquals(str1, str2))
Console.WriteLine(str1 = str2)
Dim str3 As String = “he”
Console.WriteLine(object.ReferenceEquals(str2, str3))
End Sub
End Class
he
False
True
True
显然,三个字符串都是he
但是str2是运行时计算的,所以它的引用和另外两个不同,而两个常量的引用(相当于地址)相同
而使用等号比较,因为都是he,所以相同。
那再来点抠字常识.
例如:
Dim S1 As String = “123456”
Dim S2 As String = String.Intern(S1.Substring(0, 3))
Dim S3 As String = “123”
Me.Text = S2 Is S3