【发布时间】:2017-08-09 11:47:03
【问题描述】:
我在每个关于这个主题的网站上都在阅读过去几天 Jon Skeets 关于 References and Values 和 Parameter passing 的文章。我理解了这两种类型的概念,它们代表什么以及与 Value 和 Reference 参数的区别是另一个规范。
我了解它是如何工作的以及如何使用它,但我不明白大家对这个话题的看法。你们都说,例如int 是一个值类型,string 是一个引用类型。但根据我的理解,类型基本上只取决于声明它们的类的类型。
看看这段代码 sn-p 来理解我的意思:
public struct IntHolder
{
public int number;
}
IntHolder first = new IntHolder();
first.number = 5;
IntHolder second = first;
first.number = 6;
现在second.number 的值为5。如果将struct 更改为class,number 将充当引用类型,因此int 是一个值类型并不重要,它只是关于类的类型。同样的例子也适用于string 等...。
显然,声明对象的类的类型设置了其对象的类型,否则我误解了一个核心概念。请纠正我并帮助我正确理解它或说出int string 等...具有特殊类型的含义,即使它们何时被初始化并不重要,所以基本上总是如此。
【问题讨论】:
-
IntHolder second = first;创建了一个新结构,而不是对第一个结构的引用。同样通过引用将参数传递给方法与引用/值类型的区别没有任何关系
-
"现在 second.number 的值为 5。如果将 struct 更改为 class,则 number 将充当引用类型" - 不,这根本不是真的。如果将结构更改为类,
IntHolder将是引用类型,但int仍将是值类型。 -
好吧,如果我的结论有误,我至少知道一个。因此,当我将
IntHolder分配为引用类型并稍后执行此操作时,IntHolder second = first;第二个将是对第一个的引用,即对创建的 IntHolder 对象的引用。因此,当我首先使用引用更改对象的值时,它会自动与第二个指向的对象的值相同,因为它是相同的。正确的?但是,例如int的类型有什么关系呢? -
使用引用类型执行
second = first复制引用。second与first无关,只是它是变量的精确副本,是指向同一对象的引用。
标签: c# value-type reference-type