这与您要更改的字段的类型无关。这里相关的实际上只是父类型的类型:
IntHolder first = new IntHolder();
IntHolder second = first;
取决于种类IntHolder
这有两种不同的效果:
对于值类型 (struct
),这会创建一个copy。值类型对象的数据存活with对象,因此所有内容都被复制。这有点相当于:
IntHolder second = new IntHolder();
second.number = first.number;
// and all other fields (visible or not) are copied too
这意味着对某个字段的赋值copied值类型将覆盖该值而不影响原始对象。这就像局部变量的行为方式:
var x = 5;
var y = 2;
y = 3; // this does not change x
但是,当类型是引用类型时,赋值second = first
只是复制参考资料。两者保存值的底层对象是相同的。因此,对任何一个对象的更改都会影响另一个对象,因为没有“other”:它是同一个对象,只是被两个单独的变量引用。
回答评论中的后续问题:
我该如何想象int
变量是值类型并且string
是引用类型吗?我的意思是,所以int
变量直接包含数字和string
变量就像一个指向字符串对象存储位置的指针?
是的,就是这样。引用的值基本上只是指向对象实际所在内存的指针,而值类型的值是整个对象本身。
这就是为什么例如将值类型作为方法的参数意味着当调用该方法时,整个值类型对象将被复制到堆栈中以供该方法执行。
类型是值类型并不意味着它的成员也都是值类型。例如,值类型中字符串成员的实际存储值仍然是对字符串对象的引用。类似地,引用类型的实际内存将包含值类型的实际值以及对other引用类型的内存位置。
如果父类型总是比对象类型更重要,那么我可以使用 int 和 string 类型做什么?
没有什么比另一个更重要的了。作为值或引用类型的对象仅影响该对象的存储方式。对于对象的成员,这是完全单独评估的。
例如,如果您只有一个类和一堆变量,是否可以将其中一些变量设置为对另一个变量的引用int
变量。
你不能像在 C 中那样拥有值类型的引用指针,不。但是您可以引用字段,从而允许您更改值类型字段的值。例如:
class Test
{
private int field;
public void ShowExample()
{
// set the value
field = 12;
// call the method and pass *a reference* to the field
// note the special syntax
MutateField(ref field);
// the field, which is a value type, was mutated because it was passed as a reference
Console.WriteLine(field == 4);
}
private static void MutateField(ref int value)
{
value = 4;
}
}