我今天早上一直在阅读MSDN“C#classes and struct”,试图更好地理解这两个概念。
类是引用类型。创建类的对象时,为其分配对象的变量仅保留对该内存的引用。将对象引用分配给新变量时,新变量引用原始对象。通过一个变量进行的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是值类型。创建结构时,为其分配结构的变量保存结构的实际数据。将结构分配给新变量时,会复制该变量。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。“ - MSDN
有人可以写几行示例代码来说明这个概念,因为我是一个年轻的高中女生试图掌握OOP概念并向我解释??
参考和价值(场景):在一本书中,有一个页面含有一个难以理解的术语,并不是每个人都能理解,因此作者决定将术语的定义包含在括号中(对于那些不熟悉的术语)术语)。这是否像传递价值一样?
如果作者在学期之后立即将页码引用放在括号中,那么不熟悉该术语的读者可以浏览以找到该术语的含义,那么这是否会通过引用传递?
答案 0 :(得分:3)
尝试将其简化为单词,区别主要在于如何存储和使用实例。
参考类型 - 顾名思义 - 始终通过引用来解决。这意味着变量不包含对象本身,而只包含有关信息在内存中的有效存储位置的信息。现在,如果将此变量分配给另一个值,则不会复制实例,只会复制引用,这意味着现在两个变量都引用相同的实例。
另一方面,值类型直接存储在它们所在的位置(例如变量)中。因此,当您对另一个变量进行赋值时,它将复制该实例,并且两者将保持分离。
假设我们有实例a和b,它们上面有一个字段x:
a = new MyReferenceType();
a.x = 5;
b = a;
a.x = 10;
// b.x is now also 10, because both a and b reference the same instance
a = new MyValueType();
a.x = 5;
b = a;
a.x = 10;
// b.x is still 5, because both a and b are distinct instances
现在作为参考可以提供更大的灵活性;引用的大小是常量,但它引用的对象实例的大小可能不同,这使得能够实现典型的OO原则,尤其是多态性。此外,与值类型相反,引用可以引用“无”,在这种情况下它们是null
。
注意:这主要是.NET Framework的实现细节。值类型(结构)有它们的用途,它们与原始类型的概念非常吻合,它们与值类型共享相同的语义。但是,他们在支持的OOP概念方面受到严格限制。
答案 1 :(得分:2)
假设我们有一个Foo类和一个struct Bar
class Foo
{
public string Name;
}
struct Bar
{
public string Name;
}
Foo f = new Foo();
Foo g = f;
f.Name = "Larry";
//Since g and f point to the same object both have a name of "Larry"
//changes to one, change all instances that point (refer) to the same object (memory location)
Bar b = new Bar();
Bar c = b;
b.Name = "Paul";
//Since Bar is a value type, when we set the name of b, c is not altered because
//b and c do not refer to the same object, they are independent variables
//each allocated their own memory
//and can vary separately after the initial assignment.