首页 > 代码库 > 深入C#数据类型

深入C#数据类型

 

             技能掌握目标:

             1.理解结构

             2.理解装箱和拆箱

             3.理解值类型和引用类型的概念

             4.理解值类型和引用类型作为方法参数的区别

             5.会使用值类型和引用类型作为方法参数解决问题

 

 值类型和引用类型:

1.值类型和引用值类型

  值类型源于System.ValueType家族,每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型数据所在的内存区域成为栈(Stack)。只要在代码中修改它,就会在它的内存区域内保存这个值。值类型包括基本数据类型(如 int float double)、枚举类型和结构类型

  引用值类型源于System.Object家族,在C#中引用值类型主要包括数组、类和接口等。

接下来是一个小的Example:

题目:已知小明和小红去年的身高是170cm,而今年小明长高了50cm,小红没有变

 

 

但是如果我用数组的话结果就是另说了~

 

它的运行结果就是:

 

哎?为什么我的赋值没有错误,但是为什么会两个的值都变了呢?

那是因为引用类型和值类型的原因,引用类型和值类型的内存变化不一样,所以导致了两种结果的变化,接下来我为大家介绍一下引用类型和值类型在内存中的变化

我们先讲值类型

首先系统为变量I分配了一段储存空间,如图:

 

然后程序将I的值赋给了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#数据类型