一、String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。 在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。
using System;
namespace Demo1
{
///<summary>
/// String连接测试
/// </summary>
public class Test
{
public static void Main(string[] args)
{
string a = "1234";
Console.WriteLine(a);
a += "5678";
Console.WriteLine(a);
Console.ReadLine();
}
}
}
运行的结果: 1234 12345678
看起来我们似乎已经把MyStr的值从“1234”改为了“12345678”。事实是这样的吗?
实际上并没有改变。在string a = "1234";代码中创建了一个String对象它的值是“1234”,MyStr指向了它在内存中的地址;
第a += "5678";代码中创建了一个新的String对象它的值是“12345678”,MyStr指向了新的内存地址。
这时在堆中其实存在着两个字符串对象,尽管我们只引用了它们中的一个,但是字符串“1234”仍然在内存中驻留。
二、引用类型
using System;
namespace Demo2
{
/// <summary>
/// String引用类型测试
/// </summary>
public class Test
{
public static void Main(string[] args)
{
string a = "1234";
Console.WriteLine(a);
Test.Change(ref a);
Console.WriteLine(a);
Console.ReadLine();
}
public static void Change(ref string s)
{
s = "5678";
}
}
}
运行结果: 1234 5678