C#中,unsafe、fixed和checked关键字

在C#中,unsafefixedchecked关键字都是用来控制代码执行和内存访问的。下面我将分别解释这三个关键字的作用。

unsafe

unsafe关键字用于声明不安全的代码块。在C#中,默认情况下,代码是安全的,这意味着它遵循.NET的安全规则,包括对内存的访问控制。使用unsafe关键字可以告诉编译器,你了解并信任这段代码,即使它可能违反安全规则。

使用unsafe关键字需要满足一些条件:

  1. 你的项目必须被标记为允许不安全代码(通过在项目的属性中设置Allow Unsafe Code)。
  2. 你的代码必须在unsafe代码块中。
  3. 你必须使用fixed关键字来固定内存块。

fixed

fixed 关键字在 C# 中主要用于固定内存地址,通常与不安全代码(unsafe)一起使用。当你在不安全的代码中直接访问内存时,使用 fixed 关键字可以确保内存地址在程序运行期间保持不变。

使用 fixed 关键字的主要原因是:在垃圾回收过程中,垃圾回收器可能会移动内存中的对象。如果一个指针指向一个对象,而该对象在垃圾回收过程中被移动,那么该指针就会变得无效。通过使用 fixed 关键字,你可以告诉垃圾回收器不要移动这个对象,从而确保指针始终指向有效的内存地址。

示例:

unsafe class Example  
{  int[] array = new int[10];  fixed int* ptr = stackalloc int[] { 1, 2, 3 };  void Method()  {  int* p = ptr; // 这里的p指向一个固定的内存地址  for (int i = 0; i < array.Length; i++)  {  *(p + i) = array[i]; // 将数组的值赋给固定的内存地址  }  }  
}

在这个例子中,我们创建了一个固定大小的数组 ptr,并在方法 Method 中使用它来修改另一个数组 array 的值。因为 ptr 是用 fixed 关键字声明的,所以它指向的内存地址在 Method 执行期间是固定的,不会发生位移

checked

checked关键字用于在算术运算中控制溢出检查。默认情况下,当一个整数运算结果超出了该类型的表示范围时,会抛出System.OverflowException异常。使用checked关键字可以强制执行溢出检查,并在发生溢出时抛出异常。

示例

下面是一个简单的示例,展示了如何使用这三个关键字:

class Program  
{  static unsafe void Main(string[] args)  {  int maxValue = int.MaxValue;  int* ptr = stackalloc int[] { maxValue }; // 创建一个固定大小的数组  fixed (int* p = ptr) // 使用fixed关键字固定内存地址  {  *(p + 1) = 0; // 尝试访问超出数组范围的内存,这会导致未定义的行为(除非使用unsafe代码)  }  Console.WriteLine(ptr[1]); // 这将输出0,因为我们在不安全的代码中修改了内存  }  
}
uint a = uint.MaxValue;unchecked
{Console.WriteLine(a + 3);  // output: 2
}try
{checked{Console.WriteLine(a + 3);}
}
catch (OverflowException e)
{Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}
输出:
2
Arithmetic operation resulted in an overflow.

如果没有checked,那么输出的就是2,不会抛出异常也不会提示结果实际上已经超出范围了。导致程序发生一些不可预估的问题;

在这个例子中,我们创建了一个固定大小的数组,并在一个fixed代码块中修改了数组外的内存。因为我们使用了unsafefixed关键字,所以这是合法的。但请注意,试图访问数组外的内存是一种未定义的行为,可能会导致程序崩溃或其他不可预测的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P8780 [蓝桥杯 2022 省 B] 刷题统计

题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b 和 n. 输出格式 输出一个…

Arduino中手写脉冲控制步进电机-2

目录 1、前言 2、时间-位移关系计算 3、Matlab计算时间和位置数据 (1)Matlab程序 &#xff08;2&#xff09;Arduino程序 4、Matlab生成Arduino电机正反转程序语句 &#xff08;1&#xff09;Arduino程序 &#xff08;2&#xff09;Matlab 命令行方式生成Arduino步进电…

【Unity自制手册】基于Unity中物体移动相关方法和API集锦(动图详解)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

快速排序回顾及相关题型

快速排序 基本思想 快排的本质其实是分治算法 分&#xff1a;先选定一个数作为基准点x&#xff0c;将所有小于x的数放到x的左边&#xff0c;将所有大于x的数放到x的右边。将所有的数按照此法分成左右两个区间。 治&#xff1a;递归调用左右两个区间&#xff0c;对左右两个区…

IPEmotion数据采集软件功能介绍

IPEmotion作为IPETRONIK的软件产品&#xff0c;主要应用于车辆测试和不同的实验室测试系统&#xff0c;能够满足各种测量需求。通过专业化的数据采集软件IPEmotion&#xff0c;我们可实现完整的数据采集过程&#xff0c;包括&#xff1a;配置数据采集设备&#xff1b;使用不同的…

SD-WAN企业组网的核心要点

随着企业网络需求的不断演进和全球化业务的扩张&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;作为一种先进的网络架构技术&#xff0c;逐渐成为企业组网的首选方案。SD-WAN通过提供更灵活、高效和安全的网络连接&#xff0c;帮助企业轻松应对不同地区和业务需求。…

计算机毕业设计---ssm+mysql+jsp实现的校园二手市场交易平台源码

项目介绍 本系统主要实现的功能有&#xff1a; 前台&#xff1a;&#xff08;1&#xff09;二手物品信息查看、搜索。 &#xff08;2&#xff09;学生注册登录、个人信息修改。 &#xff08;3&#xff09;二手物品信息发布、编辑。 &#xff08;4&#xff09;二手物品评论、回…

snap7西门子通讯 官方方法

官方文档 Util — python-snap7 0.0rc0 documentation 不用struct.unpack解析 Python使用python-snap7实现西门子PLC通讯-CSDN博客 python使用Snap7读写西门子S7系列PLC_python写入数据到s7-300db块-CSDN博客

【Unity细节】为什么按下移动键之后,物体还是会滑行一段距离(阻力都无穷大了)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

内存满了无法开机(Ubuntu)

文章目录 在开机界面长按“shift”进入进入shell命令模式详细步骤选择Recovery Menu删除不需要的文件 在开机界面长按“shift”进入 进入shell命令模式详细步骤 选择Recovery Menu 删除不需要的文件 自己看着办吧

STM32 IIC开发学习

1IIC总线时序图 ① 起始信号 当 SCL 为高电平期间&#xff0c;SDA 由高到低的跳变。起始信号是一种电平跳变时序信号&#xff0c;而不是 一个电平信号。该信号由主机发出&#xff0c;在起始信号产生后&#xff0c;总线就会处于被占用状态&#xff0c;准备数据 传输。 ② 停止信…

Android 8.1 设置USB传输文件模式(MTP)

项目需求&#xff0c;需要在电脑端adb发送通知手机端接收指令&#xff0c;将USB的仅充电模式更改成传输文件&#xff08;MTP&#xff09;模式&#xff0c;便捷用户在我的电脑里操作内存文件&#xff0c;下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…

腾讯云轻量应用主机与云服务器功能、性能区别对比总结

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

事务的简介

一、什么是事务 事务是一组数据库的操作序列&#xff0c;包含一个或多个sql操作命令&#xff08;增删改&#xff09;&#xff0c;事务将所有的操作命令看做一个不可分割的整体&#xff0c;向数据库系统提交或撤销操作&#xff0c;所有操作要么执行要么不执行。 ●事务是一种机…

Go语言学习第一天

Go语言简介 go语言的特性&#xff1a; 一个目录下的同级文件属于同一个包。 包名可以与其目录名不同 &#xff1f;。 main包是Go语言程序的入口包&#xff0c;一个Go语言程序必须有且仅有一个main包&#xff0c;如果一个程序没有main包&#xff0c;那么编译事就会出错&#x…

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

出版实务 | 工具书

文章目录 字典、词典字典、词典的组织结构常用字典、词典介绍目前最常用、最通行的小型字典&#xff1a;《新华字典》常用的大型字典&#xff1a;《汉语大字典》最常用的中型词典&#xff1a;《现代汉语词典》常用的大型词典&#xff1a;《辞海》《辞源》《汉语大词典》 百科全…

机器学习笔记--图的基本表示和特征工程

斯坦福大学CS224W图机器学习笔记 学习参考 CS224W公开课:双语字幕 斯坦福CS224W《图机器学习》课程(2021) by Jure Leskove 官方课程主页:官方主页 子豪兄精讲:斯坦福CS224W图机器学习、图神经网络、知识图谱 同济子豪兄 子豪兄公开代码:同济子豪兄CS224W公开课 基于…

进程间通信-匿名管道

一 什么是通信 就是进程间的数据交换&#xff0c;进程间由于具有独立性&#xff0c;需要操作系统提供能让进程间交换信息&#xff0c;也就是数据的方法。 二 如何做到 让不同进程看到同一份资源(这不是很简单的事吗)&#xff0c;我在父进程定义一个变量&#xff0c;子进程不就…

庙算兵棋推演AI开发初探(2-编写策略(上))

开始研读step()函数的编写方法。 这个是图灵网提供了一些基础的ai代码下载&#xff08;浏览需要注册&#xff0c;下载需要审批&#xff09;。 AI开发中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/ai_center/show 一、代码研读(BaseAgent类) 1.step函数 这段代码定…