首页 > 编程语言 >7_C# 中的装箱和拆箱

7_C# 中的装箱和拆箱

时间:2024-03-03 23:13:31浏览次数:28  
标签:类型转换 拆箱 C# 将值 引用 类型 装箱

C# 中的装箱和拆箱

1. 什么是装箱和拆箱?

  • 装箱:将值类型转换为引用类型的过程。
  • 拆箱:将引用类型转换为值类型的过程。

2. 装箱和拆箱的作用

  • C# 中值类型和引用类型的最终基类都是 Object 类型(它本身是一个引用类型)。
  • 通过装箱和拆箱,可以将值类型当做引用类型来处理,从而将值类型与引用类型链接起来。
  • 常见应用场景:
    • 将值类型传递给需要引用类型参数的方法
    • 将值类型存储在集合中
    • 使用泛型

3. 装箱和拆箱的示例

// 定义一个值类型
public struct Point
{
    public int X;
    public int Y;
}

public class Program
{
    public static void Main(string[] args)
    {
        // 值类型
        Point point = new Point(10, 20);

        // 装箱:将值类型转换为引用类型
        object obj = point;

        // 拆箱:将引用类型转换为值类型
        Point point2 = (Point)obj;

        // 验证
        Console.WriteLine(point.X == point2.X); // 输出:True
        Console.WriteLine(point.Y == point2.Y); // 输出:True
    }
}

4. 装箱和拆箱的性能

装箱和拆箱的过程会有一定的性能消耗,因为涉及到内存分配和类型检查。因此,在频繁使用值类型的情况下,应尽量避免装箱和拆箱操作。

5. 避免装箱和拆箱的建议

  • 使用泛型
  • 使用显式类型转换
  • 使用值类型的引用类型包装类

总结:

  • 装箱和拆箱是 C# 中用于将值类型和引用类型进行转换的机制。
  • 装箱和拆箱有一定的性能消耗,应尽量避免频繁使用。
  • 可以通过使用泛型、显式类型转换、值类型的引用类型包装类等方式来避免装箱和拆箱。

标签:类型转换,拆箱,C#,将值,引用,类型,装箱
From: https://www.cnblogs.com/cookie2030/p/18050959

相关文章

  • C++编译过程
     第一步:.cpp→.i第二步:.i→.s  是汇编文件第三步:.s→.o 此时已经算是目标文件的最终形态了,完整后缀是.obj第四步:通过链接器将用的到的库,如.dll和.o文件连接起来,执行.exe就是相当于执行前面连接起来的这堆文件 详细过程和G++调用参考:https://zhuanlan.zhihu.c......
  • C++ map用法总结(整理)
    (转载补充)原文链接:https://blog.csdn.net/sevenjoin/article/details/819438641,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数......
  • buffer 和 cache 的含义
    看到write-buffer和read-cache瞬间懂了 简单说,Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓......
  • C语言基础-2、循环
    一、while语法反复多次的做,反复多次的判断if做一次并做一次判断while循环:当条件满足时,不断地重复循环体内语句ex1:#include<stdio.h>intmain(){ while(条件成立时) { //执行语句 } return0;}二、do-while语法先做循环体语句,再去判断循环语句ex1:*#includ......
  • P2946 [USACO09MAR] Cow Frisbee Team S
    原题链接题解设\(sum\)为总能力则若\(sum\)是\(F\)的倍数\(\to\)\(sum\mod\F=0\)根据加法求模的特性,我们可以设\(dp[i][j]\)为加上第\(i\)个元素后,模为\(j\)的方案数转移方程移得注意一个细节:按照遍历顺序,每个元素要么不是一套方案的第一个元素,要么是所......
  • ConcurrentSkipListMap
    为了引出ConcurrentSkipListMap,先带着大家简单理解一下跳表。对于一个单链表,即使链表是有序的,如果我们想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低,跳表就不一样了。跳表是一种可以用来快速查找的数据结构,有点类似于平衡树。它们都可以对元素进行快速的查......
  • [详解-vector] C++必知必会 vector常用各种操作解析
    原文转载自知乎:https://zhuanlan.zhihu.com/p/648650828vector是C++标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。下面详细介绍vector的使用方法,并提供相应的代码案例。1.包含......
  • C++ 字符串(string)常用操作总结
    转载自知乎回答:https://zhuanlan.zhihu.com/p/553061732由单引号括起来的一个字符被称作char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上就是由常量字符构成的数组,,编译器在每一个字符串后面添加一个空字符('\0'),因此字符串的实际长度要......
  • 前端学习-vue视频学习004-响应式数据ref reacive
    尚硅谷视频教程响应式数据vue2中,写在data()里的数据自动成为响应式数据vue3定义响应式数据,使用ref()或reactive()什么是响应式数据:数据改变时。页面随之变化,即为响应式数据ref()创建基本类型的响应式数据首先引入refimport{ref}from'vue'所有需要动态变化的数......
  • 「java.util.concurrent并发包」之 AQS
    AQS的原理是什么?AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的......