zoukankan      html  css  js  c++  java
  • 《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(二)

    引用类型和值类型

    使用引用类型时,必须注意到一些性能损耗,要考虑以下事实:

    1. 内存必须从托管堆上分配
    2. 堆上分配的每个对象都有一些额外的成员,这些成员必须初始化
    3. 对象中的其他字节(为字段而设)总是设置为0
    4. 从托管堆上分配一个对象时,总是强制执行一次垃圾收集操作

    虽然FCL得大多数类型都是引用类型,但程序员使用最多的还是值类型,如果一个程序全部使用的是引用类型,那么它的性能会极度低下。

    为了提升性能,CLR提供了名为“值类型”的轻量级类型。

    值类型不受GC得控制。


    .NET Framework SDK明确指出,哪些类型是值类型 OR 引用类型:

    任何称为“类”的都是引用类型:System.Exception类、System.Random类;

    结构或者枚举为值类型:System.Int32结构、System.Boolean结构、System.DayOfWeek枚举等。

    image

    以下代码演示了引用类型和值类型区别:

    //引用类型(类)
    class IsaacRef{public Int32 x;}
    //值类型(结构)
    struct IsaVal{public Int32 x;}
     
    static void ValueTypeDemo(){
         IsaacRef r1 = new IsaacRef();    //在堆上分配
          IsaVal v1 = new IsaVal();        //在栈上分配
          r1.x = 5;//提取指针
          v1.x = 5;//在栈上修改
          Console.WriteLine(r1.x);//显示5
         Console.WriteLine(v1.x);//显示5
     
         IsaacRef r2 = r1;//只复制引用(指针)
          IsaVal v2 = v1;//在栈上分配并复制成员
          r1.x = 8;//r1.x和r2.x都会改
          v1.x = 9;//v1.x会改,v2.x不会变
          Console.WriteLine(r1.x);//显示8
         Console.WriteLine(r2.x);//显示8
          Console.WriteLine(v1.x);//显示9
         Console.WriteLine(v2.x);//显示5
    }

    SNAGHTML6d788b

    选择使用值类型还是引用类型

    某些时候,值类型能提供更好的性能,具体说除非以下所有条件都满足,否则不应将一个类型声明为值类型:

    1. 类型具有基元类型的行为。(即其中没有成员会修改类型的任何实例字段)
    2. 类型不需要从其他任何类型继承
    3. 类型也不会派生出其他类型

    除了满足以上3个条件之外,还必须满足以下任一条件:

    1. 类型的实例较小(约16字节或者更小)
    2. 类型的实例较大(大于16字节),但不作为方法实参传递,也不从方法返回

    image

    在编程的道路上,一往无前,埋头狂奔。
    [奔跑的人生] | [segmentfault] | [spring4all] | [csdn] | [掘金] | [OSChina] | [简书] | [知乎] | [51CTO]
  • 相关阅读:
    「Baltic2015」Network
    noip模拟赛 蒜头君的排序
    noip模拟赛 蒜头君的兔子
    codevs2171 棋盘覆盖
    noip模拟赛 蒜头君的坐骑
    noip模拟赛 蒜头君的树
    noip模拟赛 蒜头君打地鼠
    noip模拟赛 密码
    noip模拟赛 轰炸
    noip模拟赛 毁灭
  • 原文地址:https://www.cnblogs.com/zhangpan1244/p/2962284.html
Copyright © 2011-2022 走看看