考虑以下代码:
public class Program
{
private static void Main(string[] args)
{
var person1 = new Person { Name = "Test" };
Console.WriteLine(person1.Name);
Person person2 = person1;
person2.Name = "Shahrooz";
Console.WriteLine(person1.Name); //Output: Shahrooz
person2 = null;
Console.WriteLine(person1.Name); //Output: Shahrooz
}
}
public class Person
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
很显然,当分配person1
到person2
与Name
物业person2
发生变化,Name
中person1
也将改变.person1
并person2
有相同的参考.
为什么何时person2 = null
,person1
变量也不会为空?
And*_*rei 182
这两个person
和person2
是引用,同一个对象.但这些是不同的参考.所以当你跑步的时候
person2 = null;
Run Code Online (Sandbox Code Playgroud)
您只更改引用person2
,保留引用person
和相应的对象不变.
我想解释这个的最好方法是简化说明.这里的情况是怎么看起来像之前 person2 = null
:
这是空分配后的图片:
正如你所看到的,在第二张图片person2
中没有引用任何东西(或null
严格来说,因为没有参考和引用null
是不同的条件,请参阅Rune FS的评论),同时person
仍引用现有对象.
Hab*_*bib 55
考虑person1
并person2
指出存储中的某些位置.在第一步中,仅从person1
存储器中保存对象的地址,然后从存储器person2
中保存对象的存储器位置的地址.稍后当您分配null
时person2
,person1
保持不受影响.这就是你看到结果的原因.
您可以阅读:Joseph Albahari的价值与参考类型
但是,对于引用类型,在内存中创建一个对象,然后通过单独的引用处理 - 而不是像指针一样.
我将尝试使用下图描绘相同的概念.
创建了person类型的新对象,person1
引用(指针)指向存储中的内存位置.
创建了一个新的引用(指针)person2
,它指向存储中的相同内容.
将对象属性Name更改为新值,person2
因为两个引用都指向同一对象Console.WriteLine(person1.Name);
输出Shahrooz
.
在分配null
给person2
引用之后,它将指向什么,但person1
仍然保持对该对象的引用.
(最后,对于内存管理,你应该看到Stack是一个实现细节,第一部分和Stack是一个实现细节, Eric Lippert的第二部分)
No *_*ame 14
您已更改person2
为引用null
,但未person1
引用该引用.
我的意思是,如果我们在分配之前person2
和person1
之前看,那么它们都引用相同的对象.然后你分配person2 = null
,所以人2现在引用不同的类型.它没有删除person2
引用的对象.
我已经创建了这个gif来说明它:
Sim*_*ead 13
因为您已将引用设置为null
.
设置引用时null
,引用本身是null
..而不是它引用的对象.
将它们视为保持偏移量为0 person
的变量.值为120. person2
具有值120.偏移量120处的数据是Person
对象.当你这样做:
person2 = null;
Run Code Online (Sandbox Code Playgroud)
你有效地说,person2 = 0;
.但是,person
仍然具有值120.
归档时间: |
|
查看次数: |
6754 次 |
最近记录: |