深入C#数据类型

一,值类型和引用类型

1.值类型源于System.ValueType 家族 ,每个值类型的对象都有一个独立的内存区域,用于保存自己的值,值类型数据所在的内存区域称为 “栈” (Stack)。

只要在代码中修改它,就会在他的内存区域内保存这个值。值类型主要包括基本数据类型(如 int,float,double)和枚举类型等。

C#中常用的数据类型

常用数据类型                      Java                         C#                         举例

整型                                   int                                int                        年龄

浮点型                               float                            float                      成绩

双精度型                           double                       double                   圆周率

字符串                             String                           string                     家庭住址

布尔型                             boolean                      bool                       是否为少数民族

枚举类                             enum                         enum                      颜色

2.引用类型

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

所有的值类型和引用类型的引用都存在栈上。

值类型赋值原理:在栈上复制的真实值A=B,将B变量中的存储的真实内容赋给了A

小Tip:堆上存储的真实对象本身真实对象属性。

 

二,结构。

 

结构的定义:

语法: 访问修饰符 struct 结构名

{

//结构体

}

结构体定义特点:

1.结构体中可以有字段,也可以有方法。

2.定义时,结构体中的字段不能赋初始值。

2.结构体的使用

结构体的构成和类有些相似在使用时注意以下几点:

1.可以不用new,直接定义结构对象即可。(条件:如果结构体中成员变量和成员方法。那么调度方法之前一定要给成员变量赋初值,否则不用new)

2.声明结构的对象后,必须给结构成员赋初始值。

构造概念:

在一个类中,一个方法名称和类名相同,而没有任何返回值类型,那么我们可以成这个方法为构造,一个类有0(反编译到底层,编译器会补全一个无参构造给我们)

到多个构造,而且构造函数可以是公用的,也可以是私有的。

3.结构的使用和经验

结构是值类型的,声明结构变量就存储一个结构的新副本,计系统要开辟一块新的空间,因此结构用得越多所消耗的空间也就越多。

三,拆箱和装箱。

数据类型存储方式可以分为值类型和引用类型,两者仍然可以相互转换。将值类型转换为引用类型的过程就做装箱,反之称为拆箱。

 

示例:

static   void   Main(string[] args)
{
int  i=123;
object  o=i;                  //装箱
i=456;                         //改变i的内容
Console.WriteLine("值类型的值为{0}",i);
Console.WriteLine("引用类型的值为{0}",o);
}

当改变i的值时,因为只能改变它自己的值,而无法修改引用类型object 的类型,可以理解为创建一个object实例,并将i的值复制给这个object。

示例:

static void Main(string[] args)
{
int  i=123;
object o=i;                 //装箱
int j=(int)o;                //拆箱
}

先将类型i进行装箱,然后把转换后的引用类型o 进行拆箱处理。切记拆箱时,被转换引用类型的数值必须能够转换为目标类型。

经验:在实际开发中,应该减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时损耗的性能比较大。

值方式参数传递:

在值方式传递时,参数可以是引用类型,也可以是值类型。

值传递:值类型(不会改变)引用类型(会改变)

引用传递:ref值类型(会改变)ref引用类型

示例1:使用引用类型作为参数

private  void  Vote(ref SE se)
{
//人气值增加1
se.Popularity++;
}

示例2:使用值类型作为参数

private void Vote(ref StructSE se)
{
     //人气值加1
  se.Popularity++;
}

结论:无论引用方式传递,还是传递值类型程序运行的结果都一样:员工的人气值发生了变化。

小结:使用值方式(不用ref修饰)传递值类型参数时,参数在方法中的修改不会保留。

使用值方式(不用ref修饰)传递引用类型参数时,参数在方法中的修改会保留。

使用引用方式(用ref修饰)传递值类型或引用类型参数时,参数在方法的修改都会保留。

 

posted on 2018-01-01 08:44  雅俗共赏_house  阅读(175)  评论(0编辑  收藏  举报

导航