变量和数据的关系,看似简单,但如果没有详细的指导未必能够理清,于是就可能导致想不明白一些算法,理解不了面向对象思想等等,这篇文章就帮助大家了解相关的内容。
C# 中变量要指定类型,这些类型可以分为三大类:值类型、引用类型和指针类型。其中指针类型在单独使用 C# 进行应用层设计的时候不太会使用,因此本文就不涉及了。结构体、枚举类型等等都属于值类型。而我们定义的类等等则属于引用类型。
引用类型属于面向对象的范畴,比较符合我们对世界的认识,理解起来会更加容易一点。我们可以理解成这样:我们的数据,也就是一个个对象,都存在于一个世界中;而变量则指向着世界之内的对象,即:

访问 arrow ,也就获取了最上角的箭头,访问 pic 仍然是左上角的箭头,由此我们就可以理解两个变量是如何储存同一个对象,以及如下所示的代码,为何会输出 "2" 而不是 "1" 了:
class MyClass
{
public int number;
}
static void Main(string[] args)
{
MyClass myVariable = new MyClass();
myVariable.number = 1;
MyClass myVariable2 = myVariable;
myVariable2.number = 2;
Console.WriteLine(myVariable.number);
}
因为针对 MyClass 这一引用类型, myVariable2 = myVariable
做到的是让 myVariable2
指向 myVariable
所指向的对象 (可能有点绕,所以加了斜体表示这段是一个整体),也就是最后结果是两个变量指向同一个对象。
同样,我们也可以理解为什么有的对象是访问不到的(右下角三角形),可以进行垃圾回收;而有的变量可能并不指向一个对象,也就是变量赋值为 null 的意义。
说完了引用类型,还有值类型。值类型的变量和数据是一一对应的,一个变量必须有一个数据,一个数据也必须处于一个变量下,即:

把这张图和引用类型图比较就能发现明显的不同了。因此,值类型赋值的时候,不能做到指向同一个数据,只能复制原来的数据,这也就解释了为什么下述代码输出 1 而不是与引用类型相同的 2 :
struct MyClass
{
public int number;
}
static void Main(string[] args)
{
MyClass myVariable = new MyClass();
myVariable.number = 1;
MyClass myVariable2 = myVariable;
myVariable2.number = 2;
Console.WriteLine(myVariable.number);
}
网友评论