• 深入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修饰)传递值类型或引用类型参数时,参数在方法的修改都会保留。

  • 相关阅读:
    Repeater OnItemCommand 失效
    继承类时的 this 和 base
    想当然造成的的错误
    排序算法二叉树
    href 一个正则表达式的解析 ? 号解析
    给父窗口添加新的代码
    ValidationSummary 控件
    交叉表 学习
    定向思维 C# datediff
    cookie 问题
  • 原文地址:https://www.cnblogs.com/864466244qq/p/8151374.html
Copyright © 2020-2023  润新知