.net - 按值字符串.net?

标签 .net string

<分区>

我知道.NET中的String是Object的子类,.NET中的Object是引用类型。因此,下面的代码让我有点困惑。你能帮我理解其中的区别吗?谢谢

我声明了一个名为 MyInt 的类:

class MyInt
{
    int i;

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

    public override string ToString()
    {
        return Convert.ToString(i);
    }
}

然后是下面的代码:

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());

产量:

9  
9

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

但是这里发生了什么?

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

 Console.WriteLine(a1);
 Console.WriteLine(b1);

这会产生:

Wazzup?
Hello

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

最佳答案

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

string a1;
string b1;

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

a1 = "Hello"; // a1 points to a place in memory with a string containing "Hello"

接下来,创建一个值为“Goodbye”的字符串,b1 设置为引用它。

b1 = "Goodbye";

接下来我们做:

b1 = a1;

这个赋值会将引用的值复制过来。现在,b1 指向了 a1 指向的字符串,而“Goodbye”是不可达的。由于字符串总是在堆上分配,垃圾收集器最终会停下来并清理“再见”正在使用的内存,因为不再有任何引用它。*

* 编辑:从技术上讲,这可能不是真的,因为字符串常量将被interned 并因此以 interned 表为根 - 但是假设这些字符串来自数据库或其他东西。

接下来,一个值为“Wazzup?”的字符串创建后,a1 被设置为对它的引用:

a1 = "Wazzup?";

b1 变量仍引用“Hello”字符串,因此它是安全的。考虑到所有这些:

// 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);

希望这能澄清事情。

关于.net - 按值字符串.net?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18261527/

相关文章:

.net - 'Microsoft.ACE.OLEDB.12.0' provider未在本地注册

.net - ASP.NET 代理应用程序

java - java 配对字符串值的最佳方式

c# - URL 重写以删除 www 并使用 web-config (c# .net) 重定向到 https

.net - 以编程方式创建的拾色器图像 .NET?

c++ - if else 语句和字符串长度之间的代码性能

C++。将符号行读入字符数组/vector 的最快方法

jquery - 删除最近的空 sibling

c++ - 从文件中读取而不跳过空格

.net - 并行时 WCF 服务变慢