变量不是对象,它只是对对象的引用。因此,例如,在以下示例中,有两个变量都引用同一个对象:
Label label1 = new Label();
Label label2 = label1;
label1.Text = "1";
label2.Text = "2";
执行该代码后,您将看到label1.Text
等于“2”而不是“1”。那是因为它们都引用了同一个Label
对象,所以当你设置 时label2.Text
,这两个变量都会改变。但是,如果您实例化了两个单独的标签对象,则结果会有所不同,例如:
Label label1 = new Label();
Label label2 = new Label();
label1.Text = "1";
label2.Text = "2";
在第二个示例中,每个变量都指向不同的Label
对象(即 Label 类的不同实例)。因此,在运行此代码后,label1.Text
将等于“1”并label2.Text
等于“2”,正如您所期望的那样。
有充分的理由说明这两个选项都很重要并且可供您使用。例如,假设您要创建一个设置Text
a 属性的方法Label
,例如:
void SetLabelText(Label labelToSet)
{
labelToSet.Text = "text";
}
您可以这样调用该方法:
Label label1 = new Label();
SetLabelText(label1);
在这种情况下,方法labelToSet
中的变量SetLabelText
将引用与变量相同的对象label1
,因此当 'SetLabelText
设置labelToSet.Text
为“文本”时,它不是创建一个新的,它只是在作为参数传递给Label
的现有对象上设置文本Label
方法,这正是你想要发生的。
由于任何变量都可以设置为新对象或现有对象,因此在将其分配给对象之前将其视为“空”。正如我一开始所说,变量不是对象,它只是对对象的引用。如果一个变量根本没有引用任何对象(它是初始状态),那么null
如果您尝试使用它,它将抛出异常。例如:
Label label1;
label1.Text = "1"; // Throws a null reference exception
您可以根据需要声明任意数量的变量,但在null
您实际实例化至少一个对象并将它们设置为该对象之前,它们都将保持不变。要实例化一个对象(即创建一个类的新实例),您必须使用new
关键字(例如new Label()
)。
然而,到目前为止我所说的一切都只适用于“引用类型”(类)。“值类型”(结构)不是这种情况。当您将变量声明为值类型时,出于所有实际目的,它实际上是对象。许多简单的数据类型,例如int
值类型。例如:
int x;
int y;
x = 1;
y = x;
y = 2;
运行上述代码后,x
will equal1
和y
will equal 2
。设置y = x
不会导致y
引用与 相同的对象x
。相反,它将值从 复制x
到y
,从而创建一个新的值类型对象。