• c#基础之值类型与引用类型


    (1)区别

    1. 值类型分配在堆栈上,引用类型是在托管堆上分配的。这里需要指出一点:如果一个引用类型中的某个属性是值类型,这个值类型的属性是分配在托管堆上的
    2. 所有的值类型都是隐式密封的(sealed),例如 :你不可能继承int 来构造自己的类型。
    3. 值类型的每一次赋值都会执行一次逐字段的复制,所以如果是频繁赋值也会造成性能上的压力,引用类型的赋值只是指针的传递,其实也是生成新的指针实例。
    4. 引用类型额外有类型对象指针和同步块索引,值类型是没有的。所以我们平时使用lock 锁的对象不可能是值类型,因为值类型没有同步块索引

    (2)相同点

    1. 值类型和引用类型都是System.Object的子类
    2. 值类型和引用类型都可以继承接口。(很多人都认为值类型不能继承接口)

    (----以上引自http://www.cnblogs.com/zhanlang/p/9603592.html)

    (3)值类型 --分为简单值类型和复合值类型--它们统一继承  System.ValueType。

     值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。 
     值类型超出作用范围系统自动释放内存。 

    1.简单值类型:整型:Int;长整型:long;浮点型:float;字符型:char;布尔型:bool

    2.复合值类型(里面可以定义更小值类型):struct,enum等。注意:struc结构和class类除了在关键字上不同其他结构是一样的。在用法上深入这里不探讨。

    3.范围

    int占4个字节32位,long占8个字节64位

    1byte(字节)=8bit(位)

    在c#中需要注意:

    Int16 = short, 占2个字节. -32768 ~ 32767

    Int32 = int, 占4个字节. -2147483648 ~ 2147483647

    Int64 = long, 占8个字节. -9223372036854775808 ~ 9223372036854775807

      以int32为例:

    int32是有符号的,所以Int32的最大数并不是42,9496,7296,而是(2^31)-1=+21,4748,3647,为什么是31次方,因为是有符号整型,最高位要空出来判断是不是负数,所以是31次方,-1是因为0占了一个数。

    但是一共还是能存储2^32次方 既42,9496,7296个数,因为有正负数,其实一样的,还是2的32次方个数 

    UInt32和Int32一样 ,也是代表一共能存储2^32次方,一共有42,9496,7296个数

    但是因为只有正数和0,所以最大值为4364967295, 既2^32-1,-1是因为0占了一个数。

    (4)引用类型----有数组,用户定义的类、接口、委托,object,字符串等。

       引用类型在堆中分配内存,初始化时默认为null。 
       引用类型是通过垃圾回收机制进行回收。 

    DemoClass  d=new DemoClass();
    
     d1=new DemoClass();
    
    d1=d;
    d1.Age=10;
    则d1与d的Age都是10

    具体原因如下:

    每定义一个值类性只是创建一个内存,存储值,引用类性则是创建2个内存,分别存储地址和值。

    ---本人菜鸟,只是从菜鸟的角度来理解,不涉及更深层次,欢迎提点。

  • 相关阅读:
    进程 触发器
    关于 if条件 光标 循环的综合应用
    3-15记录
    day3.python 学习之列表
    day2: python3.5学习——逻辑判断
    day1: python3.5学习
    OpenGL_曲线函数
    OpenGL_赛平斯基垫片
    【quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
    Python正则表达式指南
  • 原文地址:https://www.cnblogs.com/anjingdian/p/10887086.html
Copyright © 2020-2023  润新知