解决 值类型和引用类型

马修

成员
已加入
2020年8月15日
留言内容
23
编程经验
Beginner
嗨,大家好,

这里的第一个问题...

如果我是对的,那么String是引用数据类型,对吗?
请参阅下面的代码:

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

最后,我应该期望nameOne和nameTwo都是Andrew,但事实并非如此。
名称Two Stays Matthew。我们是否可以得出结论String是特例,但是它是引用类型,其行为类似于值类型?

谢谢!
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
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行之后,我可以更改Text属性,并可以从其他变量中看到该更改。

字符串的特殊之处在于它们是不可变的,这意味着字符串对象不能更改。那不是您的代码要做的,它创建了一个新对象并将其分配给一个变量。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您正在将对象及其属性混淆。考虑以下类型:
C#:
public class Person
{
    public string Name { get; set; }
}
让我们尝试使用与该类型等效的代码:
C#:
人 personOne = new Person {Name = "Matthew"};
Person personTwo = personOne;
personOne = new Person {Name = "Andrew"};
你在那里应该期待什么?创建一个新对象并 人一个 引用它。下一个, perosn2 指的是同一个对象。最后,创建另一个新对象,然后 人一个 指的是。为什么最后一行会对 人二?考虑这个真实的例子。您雇了一个名叫Matthew的人打扫您的房屋。一段时间后,您也让Matthew也开始清洁您的游泳池。在此之后的一段时间,您会得到一个叫安德鲁的人来打扫您的房子。清洁游泳池的人叫什么名字?马修,对不对?为什么要期望编程对象以某种不可思议的方式工作,而它们所基于的现实世界对象却不能呢?

我认为您感到困惑的原因是您将这种情况与以下情况混淆了:
C#:
人 personOne = new Person {Name = "Matthew"};
Person personTwo = personOne;
personOne.Name = "Andrew";
在这种情况下,只有一个 目的。在第二行之后 人一个人二 引用该对象。在这种情况下,不是最后一行将新对象分配给 人一个,代码对对象进行了更改 人一个 已经提到。因为那是同一个对象 人二 指的是,您会看到更改反映在 人二 多变的。以我的实际示例为例,这就像马修(Matthew)在开始清洁您的游泳池后将他的名字更改为安德鲁(Andrew)。只有一个人,因此无论您是与打扫房屋的人还是打扫泳池的人交谈,该人的任何变化都将得到反映。

类(即引用类型)非常容易理解,因为它们的行为就像现实世界中的对象一样,这是面向对象编程的重点。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我们是否可以得出结论String是特例,但是它是引用类型,其行为类似于值类型?
开头似乎是这样,但是String的行为像引用类型一样。 String和其他引用类型之间有两个区别。

首先,正如JohnH所说,String对象是不可变的,这意味着一旦创建它们就不能更改。但是,这在引用类型之间并不是唯一的。一旦创建了Font对象,就无法更改它,而且我可以想象还有其他对象。

其次,String是唯一可以按字面表示的引用类型。在您的原始代码中,您使用的是文字字符串,这可能是因为您没有意识到文字会创建一个新的对象而把您扔了。这就是为什么我们从那以后使用的示例使用 新的 创建新对象的关键字是等效的。
 

马修

成员
已加入
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行之后,我可以更改Text属性,并可以从其他变量中看到该更改。

字符串的特殊之处在于它们是不可变的,这意味着字符串对象不能更改。那不是您的代码要做的,它创建了一个新对象并将其分配给一个变量。

感谢您的回答。我知道在您的代码中,直到第2行,变量1和2引用相同的按钮。在第3行之后,它们不再相同,因为您为一个按钮分配了一个新按钮。所以实际上与下面的代码相同,对吗?:

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

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
没错,代码和字符串也是如此,每个字符串文字都是一个新实例。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
我想我已经开始了解它了。基于下面的代码,我感到困惑。

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

在第3行之后,这两个数组仍然相同,但这与用字面量更改字符串有所不同。
是的,那是不同的。在第3行,您要更改数组中的一项(类似于更改对象的属性),而不是将新数组分配给y变量。
 
最佳 底部