0

今天早上我一直在阅读 MSDN “C# classes and struct”,试图更好地理解这两个概念。

类是引用类型。当创建类的对象时,分配给该对象的变量只保存对该内存的引用。当对象引用分配给新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。

结构是一种值类型。创建结构时,分配给结构的变量保存结构的实际数据。当结构被分配给一个新变量时,它被复制。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。”--MSDN

有人可以写几行示例代码来说明这个概念,因为我是一个试图掌握 OOP 概念并向我解释的年轻高中女生吗?

参考与价值(场景):一本书中有一页术语比较难懂,不是所有人都能理解,所以作者决定把术语的定义放在括号里(给不熟悉术语的人) . 这就像按值传递吗?

如果作者将页码引用放在术语后面的括号中,不熟悉该术语的读者可以浏览找到该术语的含义,那么这是否是引用传递?

4

2 回答 2

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 概念方面受到严格限制。

于 2012-08-05T17:42:12.437 回答
2

假设我们有一个类 Foo 和一个结构 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. 
于 2012-08-05T17:29:55.910 回答