zoukankan      html  css  js  c++  java
  • C# 引用类型和值类型

    C# 引用类型和值类型

    CLR支持两种类型:引用类型和值类型。

    1.引用类型

    (1)内存必须从托管堆上分配;

    (2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员必须初始化;

    (3)对象的其他字节总是设为零;

    (4)从托管堆分配对象时,可能强制执行一次垃圾回收。

    2.值类型

    (1)一般在线程栈上分配;

    (2)不受垃圾回收器控制;

    3.两者的区别

    (1)值类型的两种表示形式:未装箱和已装箱,引用类型都是已装箱;

    (2)值类型从System.ValueType派生,提供了与System.Object相同的方法,但是重写了Equals和GetHashCode方法;

    (3)由于值类型不能作为基类型,所以不应在值类型中使用虚方法;

    (4)引用类型包含堆中对象的地址,默认为null;

    (5)将值类型变量赋值给另外一个值类型变量,会复制每个字段的值,而引用类型则只复制内存地址,所以改变值类型的复制对象不会影响原值,但是引用类型会改变原值;

    (6)由于未封装的值类型不在堆上分配,如果分配后该类型的事例不再活动,其内存就会被释放。

    4.装箱

    定义:将值类型转换成引用类型。

    (1):在堆内存中分配值类型各字段所需的内存加上额外成员(类型对象指针和同步块索引)所需的内存;

    (2):值类型的字段复制到新分配的对内存;

    (3):返回对象地址。

    5.拆箱

    定义:将引用类型转换为值类型。

    (1):获取已装箱事例的各字段值;

    (2):将字段包含的值从堆复制到栈的值类型。

    注意:

    (1):如果已装箱事例的引用为null,抛出NullReferenceException异常;

    (2):如果引用的对象不是所需值类型的已装箱实例,抛出InvalidCastException异常。

    例如:

    1 public static void Main()
    2 {
    3      Int32 x = 5;
    4      Object o = x;   
    5      Int64 y = (Int64) (Int32) o;
    6 }
  • 相关阅读:
    C#构造函数、操作符重载以及自定义类型转换
    类型和成员基础
    基元类型、引用类型和值类型
    类型基础
    Sublime之快捷键(二)
    Sublime之插件的安装(三)
    Sublime删除项目删不掉?
    Sublime之插件的安装(二)
    手机网页的头部meta的相关配置~~
    Rem自适应js---flexible.min.js
  • 原文地址:https://www.cnblogs.com/Johar/p/5597718.html
Copyright © 2011-2022 走看看