关于C#中的string


1、String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。

在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。

先看一个例子:


8 public class Test
9 {
10 public static void Main(string[] args)
11 {
12 string a = "1234";
13 Console.WriteLine(a);
14
15 a += "5678";
16 Console.WriteLine(a);
17 Console.ReadLine();
18 }
19 }
20}


运行结果是1234

12345678

解释:看起来我们似乎已经把a的值从“1234”改为了“12345678”。事实是这样的吗?实际上并没有改变。在第12行代码中创建了一个String对象它的值是“1234”,a指向了它在内存中的地址;第15行代码中创建了一个新的String对象它的值是“12345678”,a指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了它们中的一个,但是字符串“1234”仍然在内存中驻留。

字符串驻留

看一下这段代码:


1using System;
2
3namespace Demo4
4{
5 /**//// <summary>
6 /// String的驻留
7 /// </summary>
8 public class Test
9 {
10 public static void Main(string[] args)
11 {
12 string a = "1234";
13 string s = "123";
14 s += "4";
15
16 string b = s;
17 string c = String.Intern(s);
18
19 Console.WriteLine((object)a == (object)b);
20 Console.WriteLine((object)a == (object)c);
21 Console.ReadLine();
22 }
23 }
24}
25

执行的结果:

False

True
在这段代码中,比较这两个对象发现它的引用并不是一样的。如果要想是它们的引用相同,可以用Intern()函数来进行字符串的驻留(如果有这样的值存在)。


2、C# string类型是特殊的引用类型,它的实例是只读的。这个地方要搞清楚语法和实现的区别 。在C#的语法中,

    ◆static void StrChange(string str) 是值传递

    ◆static void StrChange(ref string str) 是引用传递

前面说过String是引用类型,这就是如果我们创建很多个相同值的字符串对象,它在内存中的指向地址应该是一样的。也就是说,当我们创建了字符串对象a,它的值是“1234”,当我们再创建一个值为“1234”的字符串对象b时它不会再去分配一块内存空间,而是直接指向了a在内存中的地址。这样可以确保内存的有效利用。看下面的代码:


1using System;
2
3namespace Demo2
4{
5 /**//// <summary>
6 /// String引用类型测试
7 /// </summary>
8 public class Test
9 {
10 public static void Main(string[] args)
11 {
12 string a = "1234";
13
14 Console.WriteLine(a);
15
16 Test.Change(a);
17
18 Console.WriteLine(a);
19 Console.ReadLine();
20 }
21
22 public static void Change(string s)
23 {
24 s = "5678";
25 }
26 }
27}
运行结果:

1234

1234
做一个小改动,注意Change(ref string s)

1using System;
2
3namespace Demo2
4{
5 /**//// <summary>
6 /// String引用类型测试
7 /// </summary>
8 public class Test
9 {
10 public static void Main(string[] args)
11 {
12 string a = "1234";
13
14 Console.WriteLine(a);
15
16 Test.Change(ref a);
17
18 Console.WriteLine(a);
19 Console.ReadLine();
20 }
21
22 public static void Change(ref string s)
23 {
24 s = "5678";
25 }
26 }
27}
28
运行结果:

1234

5678


猜你喜欢

转载自blog.csdn.net/yalunwang123/article/details/43562595