字符串的值.net?

tal*_*gal 3 .net string

我知道.NET中的String是Object的子类,.NET中的Objects是引用类型.因此,下面的代码让我感到困惑.你能帮我理解一下这个区别吗?谢谢

我宣布了一个名为MyInt的类:

class MyInt
{
    int i;

    public int number
    {
        get { return i; }
        set { i = value; }
    }

    public override string ToString()
    {
        return Convert.ToString(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是以下代码:

MyInt a = new MyInt();
MyInt b = new MyInt();
a.number = 5;
b.number = 7;
b = a;
a.number = 9;

Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
Run Code Online (Sandbox Code Playgroud)

产量:

9  
9
Run Code Online (Sandbox Code Playgroud)

我理解这是因为这是一个Object = Reference Type,因此a和b现在引用堆上的同一个对象.

但这里发生了什么?

 string a1;
 string b1;
 a1 = "Hello";
 b1 = "Goodbye";
 b1 = a1;
 a1 = "Wazzup?";

 Console.WriteLine(a1);
 Console.WriteLine(b1);
Run Code Online (Sandbox Code Playgroud)

这会产生:

Wazzup?
Hello
Run Code Online (Sandbox Code Playgroud)

String是一个被区别对待的对象吗?

Mik*_*sen 6

首先,我们创建两个字符串变量.现在,他们没有引用任何内容,因为它们没有被初始化:

string a1;
string b1;
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个值为"Hello"的字符串,并返回对内存中该空间的引用. a1设置为该引用:

a1 = "Hello"; // a1 points to a place in memory with a string containing "Hello"
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个值为"Goodbye"的字符串,b1设置为引用该字符串.

b1 = "Goodbye";
Run Code Online (Sandbox Code Playgroud)

接下来我们做:

b1 = a1;
Run Code Online (Sandbox Code Playgroud)

此赋值将复制引用的值.现在,b1指向字符串a1指向,并且"Goodbye"无法访问.由于字符串总是在堆上分配,因此垃圾收集器最终会停止并清理"Goodbye"正在使用的内存,因为没有任何引用它.*

*编辑:从技术上讲,这可能不是真的,因为字符串常量将被实习并因此被实习表生根 - 但我们只是说这些字符串来自数据库或其他东西.

接下来,一个值为"Wazzup?"的字符串.创建,a1设置为对该的引用:

a1 = "Wazzup?";
Run Code Online (Sandbox Code Playgroud)

"Hello"字符串仍然被b1变量引用,因此它是安全的.考虑到这一切:

// Prints "Wazzup" because we just set a1 to a reference to that string
Console.WriteLine(a1);

//Prints "Hello" because b1 still has its value it had copied over from a1
Console.WriteLine(b1);
Run Code Online (Sandbox Code Playgroud)

希望这能澄清事情.