一个变量不是对象,它只是对对象的引用。因此,在下面的例子中,有两个变量都引用同一个对象:
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”,正如您所期望的那样。
这两个选项之所以重要且可用,有很好的理由。例如,假设您想要创建一个设置
Label
的
Text
属性的方法,例如:
void SetLabelText(Label labelToSet)
{
labelToSet.Text = "text";
}
你可以这样调用该方法:
Label label1 = new Label();
SetLabelText(label1);
在这种情况下,
SetLabelText
方法中的
labelToSet
变量将引用与
label1
变量相同的对象,因此当 '
SetLabelText
将
labelToSet.Text
设置为 "text" 时,它不会创建一个新的
Label
,而是只是在传递给方法的现有
Label
对象上设置文本,这正是您想要发生的事情。
由于任何变量都可以设置为新对象或现有对象,因此在分配给对象之前,它被视为“null”。正如我一开始所说,变量不是对象,它只是对象的引用。如果变量根本没有引用任何对象(它的初始状态),则它是
null
,如果尝试使用它,则会抛出异常。例如:
Label label1
label1.Text = "1"
你可以声明任意数量的变量,但在实例化至少一个对象并将其设置为该对象之前,它们都将是null
。要实例化一个对象(即创建一个类的新实例),必须使用new
关键字(例如:new Label()
)。
然而,到目前为止我所说的一切只适用于“引用类型”(类)。这不适用于“值类型”(结构体)。当您将变量声明为值类型时,从实际目的来看,它实际上就是对象。许多简单的数据类型,如int
,都是值类型。例如:
int x;
int y;
x = 1;
y = x;
y = 2;
运行以上代码后,
x
的值将等于
1
,
y
的值将等于
2
。设置
y = x
不会导致
y
引用与
x
相同的对象。相反,它会将值从
x
复制到
y
,从而创建一个新的值类型对象。
Myclass a = new Myclass()
,将保留一些内存单元(例如1000、1001、1002、1003),当您将此对象(a)与同一类的另一个对象进行比较Myclass b = new Myclass()
时,将比较内存位置,它们保存的数据不重要,a和b都可以包含“1”作为数据,但它们不相等(谈论内存位置)。 - Mahdi Tahsildariint a = 10; int b = 10; bool isEqual = a == b; //isEqual = true
。 - Mahdi Tahsildari