Classname instancename = value“与”Classname instancename = new Classname(); instancename = value“相同?

时间:2018-05-16 07:27:52

标签: c#

TestClass p=new Testclass();
p=value;

TestClass p=value;

我运行了一些测试,它们看起来是一样的,但我想确定第二个没有“new”关键字不是问题。

对不起新手问题,谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

当你在下面做

1.TestClass p=new Testclass(); //this will create new p 

2. var value = new Testclass();
TestClass p=value;//this will assign already created instance to p i.e. reference assignment

首先将它们全部一起创建新对象,但在第二种情况下,当你指定引用时,则value和p都指向同一个实例,所以如果你做了改变就像

value.property = 'abc';//it affect p
p.property = 'xyz';// it affect value

这是因为两者都指向同一个对象。

答案 1 :(得分:1)

显然你没有做足够的测试,因为 是一个至关重要的区别。如果你有:

var value1 = new TestClass();
var value2 = new testClass();

value1.Foo = "Bar";
value2.Foo = "Baz";

Console.WriteLine($"Val 1: {value1.Foo}, Val 2: {value2.Foo}");

您将按预期获得"Val 1: Bar, Val 2: Baz",但如果您这样做了:

var value1 = new TestClass();
TestClass value2 = value1;

// ...The rest as before

你得到:"Val 1: Baz, Val 2: Baz"

发生这种情况,因为value2实际上指向与value1相同的对象。这可以是将两个人的地址发送到记录卡上的真实位置,并且只要他们需要该位置,他们就会引用该记录卡。

这在编程中是变量的地址或参考,即存储在存储器中的位置。当他们拥有相同的地址时,无论你做什么变量,都会影响另一个,就像一个人画了明信片所指的房子一样,另一个人会看到那些变化。

然而,为了让事情更棘手:

var value1 = new TestClass();
var value3 = new TestClass();
TestClass value2 = value1;   // Value2 is now sharing the reference of value1
                             // Any changes to value2 will effect value1
value2 = null;               // This does not set the value of value1 to null
value2 = value3;             // This does not set the value of value1 to value3

回到类比,当我们将一个引用类型变量分配给另一个时,我们正在做什么,我们给一个人一张带有不同地址的新记录卡。显然,无论原始位置是什么,新的位置都不会改变。

在编程中,我们只是告诉它现在要引用的对象。如果您确实希望value2 = null的行为也会value1 null,那么仍有办法实现这一目标。