解决 价值类型和参考类型

Matthieu.

成员
加入
20月15日,2020年8月15日
消息
23
编程经验
Beginner
大家好,

这里的第一个问题......

如果我是正确的,字符串是一个引用数据类型,对吗?
请参阅下面的代码:

C#:
            String nameOne = "Matthew";
            String nameTwo = nameOne;
            nameOne = "Andrew";

最后,我应该期待名称是一个名称和nametwo成为安德鲁,但这不是这种情况。
Nametwo保持马修。我们可以得出结论,字符串是特殊情况,但它是一个引用类型,它表现得像一个值类型?

谢谢!
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,158
地点
挪威
编程经验
10+
C#:
Button one = new Button();
Button two = one;
one = new Button();
Would you expect two to reference the same button as one here? Why? A new object has been assigned to just one of the variables.

使用引用类型,您可以使用两个变量引用相同的对象。在第2行后检查这些对象是否相等(它们是)。所以你可以使用两个变量 改变 例如,对象可以在我的第2行之后我可以更改文本属性,并且可以看到从另一个变量的更改。

具有字符串的特殊情况是它们是不可变的,这意味着字符串对象无法改变。这不是您的代码无论如何所做的,它创建并将新对象分配给一个变量。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
您正在将对象与其属性困惑。考虑此类型:
C#:
public class Person
{
    public string Name { get; set; }
}
让我们尝试对该类型的代码等同于:
C#:
人 personOne = new Person {Name = "Matthew"};
Person personTwo = personOne;
personOne = new Person {Name = "Andrew"};
你应该期待什么?创建了一个新对象 人员 是指它。下一个, Perosntwo. 指该对象。最后,创建了另一个新对象 人员 是指那个。为什么上行应该有任何影响 persontwo.?考虑这个真实的例子。你雇用了一个名叫马修的人清洁你的房子。一段时间后,你也可以开始清洁游泳池。在那之后的一段时间,你让一个名叫安德鲁的人清洁你的房子。清理你的游泳池的人的名字是什么?马修,对吗?为什么你期望编程对象以一些魔法方式工作,即他们基于的现实世界对象不是吗?

我认为你很困惑的原因是你正在混合这种情况:
C#:
人 personOne = new Person {Name = "Matthew"};
Person personTwo = personOne;
personOne.Name = "Andrew";
在这种情况下,只有一个 目的。第二行后,两 人员persontwo. 请参阅该对象。在这种情况下,而不是将新对象分配给的最后一行 人员,代码对对象进行了更改 人员 已经是指的。因为这是相同的对象 persontwo. 是指的,你会看到改变反映在 persontwo. 多变的。使用我的真实榜样,就像马修在开始打扫你的游泳池后将他的名字改为安德鲁。无论您是否与清洁您所在房屋的人交谈,只有一个人会反映对该人的任何改变。

类,即引用类型,很容易理解,因为它们就像真实世界的对象一样,这是面向对象编程的整个点。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,710
地点
悉尼,澳大利亚
编程经验
10+
我们可以得出结论,字符串是特殊情况,但它是一个引用类型,它表现得像一个值类型?
它可以似乎开始使用但字符串行为每位都像引用类型一样。字符串和其他参考类型之间存在两个差异。

首先,正如Johnh所说,String对象是不可变的,这意味着一旦创建就无法改变它们。这在参考类型中不是唯一的。一个字体对象一旦创建,我就无法更改,我会想象还有其他人。

其次,字符串是可以字面上表示的唯一引用类型。在原始代码中,您正在使用文字字符串,可能会抛出您,因为您没有意识到文字创建一个新对象。这就是为什么我们使用的例子以来使用它 新的 创建新对象的关键字是等效的。
 

Matthieu.

成员
加入
20月15日,2020年8月15日
消息
23
编程经验
Beginner
C#:
Button one = new Button();
Button two = one;
one = new Button();
Would you expect two to reference the same button as one here? Why? A new object has been assigned to just one of the variables.

使用引用类型,您可以使用两个变量引用相同的对象。在第2行后检查这些对象是否相等(它们是)。所以你可以使用两个变量 改变 例如,对象可以在我的第2行之后我可以更改文本属性,并且可以看到从另一个变量的更改。

具有字符串的特殊情况是它们是不可变的,这意味着字符串对象无法改变。这不是您的代码无论如何所做的,它创建并将新对象分配给一个变量。

感谢您的回答。我明白,在代码中,直到第2行,变量一和两个引用相同的按钮。第3行后,它们不再相同,因为您将新按钮分配给一个。所以它实际上它与下面的代码相同,正确?:

C#:
            int[] x = { 10 };
            int[] y = x;
            y = new int[5];
变量x和变量y引用相同的数组,但在第3行之后,它们是不同的,因为您将新数组响起变量y?
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,158
地点
挪威
编程经验
10+
这是正确的,与您的代码和字符串相同,每个字符串文字都是一个新实例。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,158
地点
挪威
编程经验
10+
我想我开始了解它。根据下面的代码,我困惑。

C#:
            int[] x = { 10 };
            int[] y = x;
            y[0] = 20;

在第3行之后,两个阵列仍然是相同的,但这与改变具有文字的字符串不同。
是的,这是不同的。在第3行您正在更改数组中的一个项目(类似于更改对象的属性),您不会将新数组分配给Y变量。
 
最佳 底部