TestClass p=new Testclass();
p=value;
TestClass p=value;
我运行了一些测试,它们看起来是一样的,但我想确定第二个没有“new”关键字不是问题。
对不起新手问题,谢谢你的帮助。
答案 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
,那么仍有办法实现这一目标。