某些类如何导致自动实例化,而其他类则不然?

时间:2013-06-10 06:51:15

标签: c# instantiation

在下面的代码中,只有一个StringBuilder实例,test2和test3实际上指向new StringBuilder()的原始实例

StringBuilder test = new StringBuilder("test");
StringBuilder test2;
StringBuilder test3;
test2 = test;
test3 = test2;

所以我可以附加test3,它会附加原始测试。

我理解String是不可变的,但请使用下面的代码

String test = new String("test");
String test2;
String test3;
test2=test;
test3=test2;

使用相同的逻辑推理它应该表现完全相同但如果我更改test3它与测试无关,这意味着当我test=test2实际上它正在做test2=new test和{test3 = new test2之类的事情时{1}}这对我来说似乎非常不合逻辑。假设我想创建自己的简单字节类,其行为类似于StringBuilder,其行为类似于String,StringBuilder类中的确切内容允许实例传递实例,而String类中的内容允许它通过使用自动创建新实例等号?我不明白test = test2在我给出的两个例子之间在逻辑上是否一致。它实际上看起来不可预测的不合逻辑。什么样的代码行实际上使这两个类之间存在差异?

当你使用与StringBuilder实例的等号时,它会传递实例,但是当你使用带有String实例的等号时,它会神奇地创建一个新实例。类中的哪一行代码确定等号的行为如何?我不喜欢这个,因为它实际上改变了等号的含义,所以我想知道至少哪一段代码改变了等号的定义。

1 个答案:

答案 0 :(得分:2)

  

在2个类

之间实际产生这种差异的代码行

您未展示的代码行。要作为test3附加到string,您需要执行其他操作:

test3 = test3 + "abc";

(如果你没有在这里执行赋值,新生成的string立即有资格进行垃圾收集,因为没有任何内容可以引用它。)

test3作为StringBuilder追加,我们不会另外分配:

test3.Append("abc");

  

假设我想创建自己的简单字节类,其行为类似于StringBuilder,而行为类似于String

要创建类似StringBuilder的类,您可以创建一个类,在调用Append()之类的方法时修改其内部状态。要创建类似String的类,您将创建一个创建类的新实例的类,其中包含由“修改”方法创建的更新状态。这些方法更新自己的内部状态。

这完全是关于实现不可变类 - 没有编译魔术,它只是一个设计决策。