zoukankan      html  css  js  c++  java
  • C#每天进步一点--引用类型和值类型

      在刚参加工作面试时,我们经常会遇到有关值类型和引用类型的问题,你回答的怎么样直接影响你在别人心目中的印象,你回答的不好说明你对C#没有深入的了解学习,今天我带大家回顾下C#中的引用类型和值类型。

        CLR支持两种类型:引用类型和值类型。虽然FCL中大多数类型都是引用类型但程序中用的最多的还是值类型。引用类型总是从托管堆上分配的,C#的new操作会返回对象的内存地址--也就是指向对象的数据的内存地址。

        设想假设每次使用一个Int32值时,都进行一次内存分配,性能会受到多大的影响,为了提升简单、常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。值类型的实例一般在线程栈上分配。在代表值类型实例的一个变量中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆中的压力,并减少了一个应用程序在其生命周期需要进行的垃圾回收次数。

       .net framework SDK文档清楚地指出哪些类型是引用类型,哪些是值类型。任何称为“类”的类型都是引用类型,例如,System.Exception 类、System.IO.FileStream 类以及System.Random类都是引用类型。相反文档将所有的值类型称为结构或枚举。例如, System.In32结构、System.Boolean结构、System.Decimal结构、System.DayOfWeek枚举以及System.Drawing.FontStyle枚举都是值类型。

      所有的结构都是抽象类型System.ValueType的直接派生类。System.ValueType本身又是System.Object派生的,所有的值类型都必须从System.ValueType派生。所有的枚举都是从System.Enum抽象类型派生,后者又是从System.ValueType派生的。

       以下代码演示了引用类型和值类型。

    //引用类型(由于使用了‘Class’)
    class SomeRef{public Int32 x;}
    
    //值类型(由于使用了‘Struct’)
    struct SomeVal{public Int32 x;}
    
    static void ValueTypeDemo(){
       SomeRef r1 = new SomeRef();   //在堆上分配
       SomeVal v1 = new SomeVal(); //在栈上分配
       r1.x = 5;                                  //提领指针
       v1.x = 5;                                 //在栈上修改
       Console.WriteLine(r1.x);         //显示“5”
       Console.WriteLine(v1.x);        //同样显示“5”
    
       SomeRef r2 = r1;                   //只复制引用(指针)
       SomeVal 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”
       
    }
    

      先就说这么多了,希望对大家有所帮助,和大家一起进步。

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/zb-success/p/3647063.html
Copyright © 2011-2022 走看看