1.什么是值类型和引用类型
值类型:直接存储其值,赋值的的时候是传递拷贝。
引用类型:存储对其值的引用,赋值的时候是传递引用。
那么值类型和引用类型都有那些呢?
值类型:byte,short,int,long,float,double,decimal,char,bool ,datetime。
引用类型: string ,class
注:这里简单说一下string,string是引用类型,但是有着像值类型一样的操作,这个咱们稍后在说。
2.如何区分值类型和引用类型
2.1区分值类型
前面我们说到了,值类型赋值的时候是传递拷贝。接下来看段代码。
static void Main(string[] args)
{
int i = 1;
int j = i;
i = 2;
Console.WriteLine("i:{0}", i);
Console.WriteLine("j:{0}", j);
Console.ReadKey();
}
看下结果。
值类型
这时候我们看到,首先是把1
赋值给i
,然后把i
的值赋值给j
,这里实际是在内存中出现了两个变量,两个值,如下图。
image.png
这个时候,改变i
的值,对j
是没有影响的。
2.2区分引用类型
区分引用类型咱们用class
来测试,先添加一个Person
类,看代码。
class Program
{
static void Main(string[] args)
{
Person p1 = new Person(10);
Person p2 = p1;
p1.Age++;
Console.WriteLine("Age1:{0}", p1.Age);
Console.WriteLine("Age2:{0}", p2.Age);
Console.ReadKey();
}
}
class Person
{
public int Age { get; set; }
public Person(int age)
{
this.Age = age;
}
}
看下结果。
image.png
咱们添加了一个Person
类,里面定义一个属性叫Age
,然后在Main
里面实例化这个类叫p1
,并给Age
赋值,然后在定义一个p2
等于p1
,这个时候,更改Age
的值,然后发现p2
里面的值也改变了,这就是引用类型和值类型最大的一个不同之处。也画个草图表示下。
image.png
为什么会有这种设计呢?
在内存中,对象的占用的空间是比较大的,每一次赋值都需要拷贝一个对象的话,对内存的浪费是比较严重的,所以采用引用的方式,不管你实例化几次,都是指向同一个对象。
2.3番外string讲解。
string是一个引用类型,但是看下面这段代码,你可能就会疑惑了。
string str1 = "aa";
string str2 = str1;
str1 = "bb";
Console.WriteLine("str1:{0}", str1);
Console.WriteLine("str2:{0}", str2);
Console.ReadKey();
看下结果。
image.png
看到这里可能该奇怪了,string
不是引用类型吗,那改变str1
的值的时候,str2
的值应该变化呀,那为什么str2
的值还是原来str1
的值呢?
其实,当我执行string str2 = str1;
的时候,确实是str2
指向了aa
这个值,str2
没有拷贝,但是当我在执行str1="bb"
其实是重新又生成了一个str1的引用指向bb
,原来的aa
其实还在。画个草图。
image.png
嗯,清晰了许多,
Study hard and make progress every day.
想要更多学习资料,欢迎关注爱游戏爱编程爱游戏爱编程.jpg