首页 > 代码库 > 深入C#数据类型
深入C#数据类型
技能掌握目标:
1.理解结构
2.理解装箱和拆箱
3.理解值类型和引用类型的概念
4.理解值类型和引用类型作为方法参数的区别
5.会使用值类型和引用类型作为方法参数解决问题
值类型和引用类型:
1.值类型和引用值类型
值类型源于System.ValueType家族,每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型数据所在的内存区域成为栈(Stack)。只要在代码中修改它,就会在它的内存区域内保存这个值。值类型包括基本数据类型(如 int float double)、枚举类型和结构类型
引用值类型源于System.Object家族,在C#中引用值类型主要包括数组、类和接口等。
接下来是一个小的Example:
题目:已知小明和小红去年的身高是170cm,而今年小明长高了50cm,小红没有变
但是如果我用数组的话结果就是另说了~
它的运行结果就是:
哎?为什么我的赋值没有错误,但是为什么会两个的值都变了呢?
那是因为引用类型和值类型的原因,引用类型和值类型的内存变化不一样,所以导致了两种结果的变化,接下来我为大家介绍一下引用类型和值类型在内存中的变化
我们先讲值类型
首先系统为变量I分配了一段储存空间,如图:
然后程序将I的值赋给了J系统为变量J分配了一段储存空间,如图:
最后 J 的值变成180,此时变量J对应的存储空间将发生变化:
接下来我们讲引用值类型的内存运作,在讲引用值类型的时候我们用到了堆和栈,在这之后我会给大家单独开一个博客在解释堆和栈。
我们用的引用值类型是数组我们来跟着代码看着草图来理解:
Int[] nameMingAge = { 19 };
int[] nameHongAge = nameMingAge;
Console.WriteLine("去年小红的年龄是:{0}\t小明的年龄是:{1}", nameHongAge[0], nameMingAge[0]);
nameHongAge[0] = 20;
Console.WriteLine("今年小红的年龄是:{0}\t小明的年龄是:{1}", nameHongAge[0], nameMingAge[0]);
Console.ReadLine();
引用值类型和值类型的数据类型分类图:
值传递和引用值传递的参数(ref)
值传递不带参数ref的方法和调用:
它的运行结果是:
加上值传递的参数 ref后的方法和调用:
它的运行结果是:
注意点:
引用传递:只要参数前有ref关键字修饰,统统称为引用传递
结论:如果是值传递(没有ref关键字),并且参数类型为值类型,那么结果不变
如果是值传递(没有ref关键字),参数是引用类型,结果永久改变!@
如果是引用传递(ref),无论参数是值类型还是引用类型,结果都会永久改变!!
----------------------------------------------------------------------------------------------------------------------
接下来我们讲一讲结构吧:
结构体
.不能为结构体中变量赋初值
.结构体中可以有方法,字段,属性
结构体是值类型,而类是引用类型
对结构体中的属性赋值的时候,可以不new出对象,直接通过变量名.属性赋值
在什么场景下使用结构体?
如果当前的抽象类型中属性量比较少的时候,我们可以考虑使用结构体
接下来让我们看看如何使用结构:
首先写介绍一下他的语法
访问修饰符 struct 结构名
{
//结构体:也就是方法和属性。
}
接下来让我们以图片的方式来给大家展示定义结构的过程
01.首先创建一个类叫做Student
02.把关键字class改成struct并且前面加上public访问修饰符
03.在Main方法中进行调用
结构体我们就讲到这里,接下来我给大家讲讲装箱和拆箱:
我们先做的就是装箱操作 如图:
它的运行结果是:
上面的图讲述的是装箱的方法,接下来讲一下拆箱的方法:
它的运行结果是:
对于装箱和拆箱的操作,本人认为能不要用最好就不要用,因为每次装箱和拆箱都会损耗一定的程序性能。而且当代码运行到公共语言规范(CLS)的时候系统会自动给弄些需要的变量进行装箱和拆箱操作,所以对于装箱和拆箱的内容我就一带而过了,这是本人的第三个博客,如果大家认为还可以的话记得关注哦~~~~
深入C#数据类型