C#中的Unsafe和Fixed

C#中的Unsafe模式与指针操作实战指南 在现代编程语言中,Unsafe模式经常被提起,尤其是在涉及到系统级编程和性能优化时。Unsafe类位于 Java 的sun.misc包下,提供了绕过 Java 安全检查的方法,使开发者能够直接操作内存。但同时,这种能力也带来了潜在的风险,比如内存泄漏和程序崩溃等问题。P/Invoke(Platform Invocation Services)是一种技术,允许托管代码通过”平台调用服务”调用非托管代码。 阅读详情

C#中的Unsafe和Fixed

托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动
垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。 非托管代码(Unmanaged Code):在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支
持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
Unsafe的代码介于这两者之间,它也是在CLR的环境中执行,但是我们可以直接操作内存。只要我们的代码包含下面三个指针操作符之一就需要使用Unsafe
关键字:
  • *
  • &
  • ->

例如:

unsafe static void ChangeValue(int* pInt)
    {
        *pInt = 23;
    }

上面的代码由于是在CLR下托管执行,为了减少内存碎片C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,所以如果我们多次调用的话就可能
导致指针指向其他的变量。比如*pInt为指向一个变量的地址为1001,CLR在重新内存整理分配后该变量就存储在地址为5001的地方。而原来1001的地方可能会
被分配其他变量,要解决这个问题我们就需要使用Fixed关键字。

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。如下面例子:

using System;
class CaryData
{
    public int data;
}

class CProgram
{
   
    unsafe static void ChangeValue(int* pInt)
    {
        *pInt = 23;
    }

    public unsafe static void Main()
    {
        CaryData cd = new CaryData();
        Console.WriteLine("改变前: {0}", cd.data);        

        fixed (int* p = &cd.data)
        {
            ChangeValue(p);
        }
        Console.WriteLine("改变后: {0}", cd.data);
    }
}

注意要勾选项目属性中生成标签的允许不安全代码。

 
http://www.cnblogs.com/carysun/archive/2009/11/07/csharp-unsafe.html
    

posted on 2017-06-19 10:41 jiahuafu 阅读(...) 评论(...) 编辑 收藏

汇川PLC和PLC之间ModebusTCP通讯 然后在全局变量中创建相应的变量关联IW和QW的寄存器创建全部变量//AM402作为主站——读H3U(D12-D21)//AM402作为主站——写给H3U(D200-D209)或者使用数组的方式。 阅读详情

相关推荐

AD9026芯片开发实战指南:从硬件配置到射频校准

本文为AD9026芯片开发实战指南,详细解析了从硬件设计、电源时钟配置、SPI初始化到多芯片同步与JESD204高速链路建立的完整流程。重点探讨了射频校准技术,包括初始化校准与跟踪校准,以保障5G、MIMO等现代通信系统所需的射频性能。旨在帮助开发者系统掌握这颗高性能射频收发器的应用,规避常见设计陷阱。

tomato的博客 851

C#中的不安全代码(关键字unsafe)和固定指针(关键字fixed)

首先先设置一下: 鼠标右键点工程,选择生成,勾选上允许不安全代码。 解释一下什么是不安全代码: C#是一门托管语言,可以不用自己去管理内存。有一些机制的出现代替了C/C++中的指针,如引用、托管、事件等机制。但是C#并没有想java一样完全抛弃掉指针,所以在C#下还可以用指针的。当一个代码块使用unsafe修饰标记符时,C#允许在函数中使用指针变量。不安全代码或非托管代码是指使用变量的代码块。 用unsafe关键字编写不安全代码 因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针。标

QQ845264718 1161

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1253

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

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

风-的博客 1733

VL53L0X测距不准?手把手教你做RefSPAD校准与环境补偿(附Arduino/STM32代码)

本文详细解析了VL53L0X激光测距传感器精度不足的原因,并提供了RefSPAD校准与环境补偿的完整解决方案。通过Arduino和STM32代码示例,手把手教你实现毫米级测距稳定性,适用于机器人避障、工业检测等场景。

weixin_28744423的博客 257

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 355

C# unsafe里的fixed是做什么用的?

1.前言如果你想在托管里面使用非托管指针,那么这个unsafe是一个选择。并且unsafe一般还带了一个fixed关键字,这个东西是干嘛用的呢?如果你看微软官方文档,它只有寥寥几字:临时固定变量以便找到其地址。你是否依然一头雾水?本篇来解析下这个fixed关键字。2.概述一:例子先上一个官方例子:static void Main(string[] args) { int[] a =...

dotNET跨平台 438

【论文笔记】Reaching agreement in the presence of faults (EIG)

1 问题定义 2 交互一致性 3 单点故障 m=1 n=4 4 多点故障(n>=3m+1) 计算过程 m=2 n=7 5 n<3m+1不能达成协定 6 带认证的算法 7 总结 这篇论文在1980年发表,是1982年著名的拜占庭将军问题论文的前身。作者Leslie Lamport是2013图灵奖得主,两篇论文引用次数分别为5000+和2000+。该论文提出的算法现在被...

zjwreal 2994

C#指针- unsafe与fixed

当你喜欢一样东西的时候就你不会去想他是否带来利益,这才是真正的喜欢。   c#在默认情况下生成的都是安全代码,即进行了代码托管(.NET的CLR机制好处之一是 ,进行代码托管,适时的释放内存,程序员便不必考虑资源 的回收问题),而此时,指针不能出现在安全代码的编译条件下。   一、unsafe  如果因需要想在c#中使用指针,那么unsafe便是一个通道(当然在使用前,需在项目属性的生成选项

暮光之城 983

Python实战日志_P4_图书馆Web API服务

目标:使用Flask将图书馆系统升级为RESTful API服务,掌握Web开发基础难度:⭐⭐⭐⭐☆预计学习时间:75分钟前置要求:已完成第3篇《个人图书馆管理系统》

qq_39436086的博客 83

OceanBase数据库:与MySQL和Oracle的函数差异分析

OceanBase数据库兼容性解析:MySQL与Oracle模式深度比较 摘要:OceanBase通过独特的双模式架构,实现了对MySQL和Oracle的高度兼容。文章首先分析了OceanBase的兼容性架构,包括SQL解析层、优化器层和执行引擎层的差异化设计。随后对比了两种模式在数据类型、SQL语法、函数支持等方面的兼容性差异,其中MySQL模式兼容5.7版本大部分功能,Oracle模式则支持155个内置函数和PL/SQL特性。最后提出了模式选择的六大考量因素,包括现有系统基础、功能需求和迁移成本等,为数

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1228

c#指针(unsafe与fixed的使用)

      c#在默认情况下生成的都是安全代码,即进行了代码托管(.NET的CLR机制好处之一是 ,进行代码托管,适时的释放内存,程序员便不必考虑资源的回收问题),而此时,指针不能出现在安全代码的编译条件下。 一、unsafe        如果因需要想在c#中使用指针,那么unsafe便是一个通道(当然在使用前,需在项目属性的生成选项中,选择“允许不安全代码”)。example 1:

badgirlxiaoxiao的专栏 3343

三维重建/SLAM笔记_最佳学习路线/攻略

本文目的 学习三维重建,需要不少知识,而知识之间又存在不同的依赖关系,为了后来人能少走弯路,也为了对自己的知识框架系统总结,特记录自己的学习路线。 学习心得 关于读书,了解基础知识是一方面,产生疑问也是一方面,为以后知道学习什么留下印象; 一回生,二回熟,看不懂时,大多是因为先验知识不够,没关系,多查多想,总会搞懂的。 学习路线 1.计算机图形学基础(OpenGL基础版)(徐文鹏 清...

惊鸿一博 3291

c# 指针unsafe/fixed -- 【一】

1.1 概述 unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。可以在属性、方法、类的声明中使用unsafe修饰符,此时类型或成员的整个正文范围均被视为不安全上下文。 fixed语句用于禁止垃圾回收器重定位可移动的变量,Fixed还可用于创建固定大小的缓冲区,fixed 语句只能出现在不安全的上下文中。 但在C#中使用指针时只能操作struct,不能操作class,不...

NCTU_to_prove_safety的博客 666

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#中指针*的使用(unsafe关键字与fixed 语句)---01

unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。有关更多信息,请参见不安全代码和指针(C# 编程指南)。 可以在类型或成员的声明中使用 unsafe 修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文。例如,以下是用 unsafe 修饰符声明的方法:   unsafe static void FastCopy(byte[] src, b

刘军的专栏 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#中的非安全编程(key:unsafe,fixed)

本文将讨论如何在C#中使用指针。 介绍  这是C/C++程序迷们经常谈论的一个话题,同时也是一个复杂的、难以理解的话题-指针!每次谈到C#,大多数我遇到的人都持这样的观点-C#中没有指针的概念。而实际上,它已经被废除了,取而代之的是C#中的非安全编程-如何在程序中使用指针。不同于其字面意思的是,使用指针编程并没有什么不安全的。  它如此受关注的根本原因是,非安全编程不同于习惯的.NET开发规范,而

旅途 704

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c#指针(unsafe与fixed的使用)

c#在默认情况下生成的都是安全代码,即进行了代码托管(.NET的CLR机制好处之一是 ,进行代码托管,适时的释放内存,程序员便不必考虑资源的回收问题),而此时,指针不能出现在安全代码的编译条件下。  一、unsafe        如果因需要想在c#中使用指针,那么unsafe便是一个通道(当然在使用前,需在项目属性的生成选项中,选择“允许不安全代码”)。 example 1: a) 创

nodeathphoenix的专栏 1435

C#中指针*的使用(unsafe关键字与fixed 语句)

转载自https://blog.youkuaiyun.com/lujunql/article/details/6961308 unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。有关更多信息,请参见不安全代码和指针(C# 编程指南)。 可以在类型或成员的声明中使用unsafe修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文。例如,以下是用unsafe修饰符声明的方法: unsafe static void FastCopy(byte[...

李趣趣的学习笔记 972

【转】C#中的非安全编程(key:unsafe,fixed)

原文地址http://www.cppblog.com/mzty/archive/2006/03/14/4126.html 本文将讨论如何在C#中使用指针。 介绍  这是C/C++程序迷们经常谈论的一个话题,同时也是一个复杂的、难以理解的话题-指针!每次谈到C#,大多数我遇到的人都持这样的观点-C#中没有指针的概念。而实际上,它已经被废除了,取而代之的是C#中的非安全编程-如何在程序中...

weixin_30468137的博客 79
上一篇: 抓包工具 - Fiddler(详细介绍)
下一篇: preset
银狐游戏开发资源2
博客等级 码龄7年 278粉丝 1130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银狐游戏开发资源2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值