变量不是对象,它只是对对象的引用。因此,例如,在以下示例中,有两个变量都引用同一个对象:
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”,正如您所期望的那样。
有充分的理由说明这两个选项都很重要并且可供您使用。例如,假设您要创建一个设置Texta 属性的方法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;
运行上述代码后,xwill equal1和ywill equal 2。设置y = x不会导致y引用与 相同的对象x。相反,它将值从 复制x到y,从而创建一个新的值类型对象。