C# unsafe code
(*) unsafe 和 fixed
unsafe
{
int[] array = new int[];
for (int i = ; i < array.Length; i++)
{
array[i] = i;
}
fixed (int* p = array)
{
for (int i = ; i < array.Length; i++)
{
System.Console.WriteLine(p[i]);
}
}
}
指针在c#中是不提倡使用的,有关指针的操作被认为是不安全的(unsafe)。因此运行这段代码之前,先要改一个地方,否则编译不过无法运行。
修改方法:在右侧的solution Explorer中找到你的项目,在项目图标(绿色)上点右键,选最后一项properties,然后在Build标签页里把Allow unsafe code勾选上。之后这段代码就可以运行了,你会看到,上面这段代码可以像C语言那样用指针操纵数组。但前提是必须有fixed (int* p = array),它的意思是让p固定指向数组array,不允许改动。因为C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,如果那样,p可能一开始指的是array,但后来array的位置被调整到别的位置后,p指向的就不是array了。所以要加一个fixed关键字,把它定在那里一动不动,之后的操作才有保障。
另有两点需要注意:
1)指针的使用必须放在unsafe的区域里;unsafe关键字也可作为类或方法的修饰符。
2)fixed (int* p = array)中,p的定义不能写在别处,而且fixed关键字也只能在unsafe区域里使用。
(*) 略简洁的unsafe写法
class Program
{
unsafe public static UInt16 Htons(UInt16 src)
{
UInt16 dest;
// 不能照搬C的源代码,因为有些类型长度不一样,如char(2字节),long(8字节)
// ((char*)&dest)[0] = ((char*)&src)[1];
// ((char*)&dest)[1] = ((char*)&src)[0];
((byte*)&dest)[] = ((byte*)&src)[];
((byte*)&dest)[] = ((byte*)&src)[];
return dest;
}
public static UInt16 ConciseHtons(UInt16 src)
{
UInt16 dest;
unsafe
{
((byte*)&dest)[] = ((byte*)&src)[];
((byte*)&dest)[] = ((byte*)&src)[];
}
return dest;
}
static void Main()
{
UInt16 val = ;
// 如果方法是unsafe的,则必须在unsafe block里调用
unsafe
{
val = Htons(val);
}
Console.WriteLine(val);
// 更简洁的写法是把unsafe block写在函数内部
val = ConciseHtons(val);
Console.WriteLine(val);
}
}
(*) stackalloc
stackalloc的用处仅仅是把数组分配在栈上(默认是分配在托管堆上的)。
class MyClass
{
public int val;
}
class Program
{
static void Main()
{
unsafe
{
MyClass *p = stackalloc MyClass[]; // Error!! 如果类型要放在托管堆上则不行,如果MyClass是struct就OK了
p->val = ;
int *iArray = stackalloc int[]; // OK,在栈上创建数组, int类型本身就是放在栈上的
}
}
}
注意:指针指向的内存一定要固定。凡是C#里的引用类型(一切类型的数组都是引用类型)都是分配在托管堆上的,都不固定。有两种方法强制固定,一种是用stackalloc分配在栈上,另一种是用fixed分配在堆上。
C# unsafe code的更多相关文章
- C#基础—不安全代码(unsafe code)
1.为何要有unsafe 也许是为了实现CLR类型安全的目标吧,默认情况下,C#没有提供指针的使用算法,但是有些情况下也可能需要指针这样直接访问内存的东西(虽然目前我还没有用过),但是有时候程序员非常 ...
- 发布web应用程序是出现unsafe code
找到了解决办法 解决方法参照: https://stackoverflow.com/questions/16567197/publish-web-application-with-unsafe-cod ...
- Unity3D 使用C#指针unsafe
Unsafe code requires the `unsafe' command line option to be specified 在Unity开发中,如果涉及到指针的使用,需要自己定义预处理 ...
- Unity3d中C#使用指针(Unsafe)的办法(转)
近日由于在U3D项目中要使用到数据传递(C++ DLL的数据传递给U3D中的C#),其中涉及到需要使用C#的指针.直接编译会出现以下错误Unsafe code requires the 'unsafe ...
- Java中Unsafe类详解
http://www.cnblogs.com/mickole/articles/3757278.html Java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操 ...
- java 非阻塞算法实现基础:unsafe类介绍
一.为什么要有Unsfae.我们为什么要了解这个类 1. java通常的代码无法直接使用操作底层的硬件,为了使java具备该能力,增加了Unsafe类 2.java的并发包中底层大量的使用这个类的功能 ...
- JAVA中神奇的双刃剑--Unsafe
前提 参考资料: Java魔法类:sun.misc.Unsafe 在openjdk8下看Unsafe源码 Unsafe介绍 在Oracle的Jdk8无法获取到sun.misc包的源码,想看此包的源码可 ...
- Understanding sun.misc.Unsafe
转自: https://dzone.com/articles/understanding-sunmiscunsafe The biggest competitor to the Java virtua ...
- Code Project精彩系列(转)
Code Project精彩系列(转) Code Project精彩系列(转) Applications Crafting a C# forms Editor From scratch htt ...
随机推荐
- shell 脚本FTP自动上传文件
下面的脚本 会把本地的文本文件压缩后, 上传到FTP服务器上. 里面有一点小逻辑, 就是上传的文本文件 是 日期时间.txt 形式的, 一天写一个日志文件, 今天的文件不上传, 只上传 老的日志文件. ...
- js深入研究之匿名函数
/* 匿名函数*/ (function() { var foo = 10; var bar = 2; alert(foo * bar);})(); /* 匿名函数,带参数 */ (function(f ...
- UITextField实现过滤选中状态拼音
先提供下简书地址, 排版更好. 我的简书地址: http://www.jianshu.com/p/80e79c6d1511 UITextField相信很多的iOS开发者都会经常用到, 最近项目中遇到了 ...
- VPN拨号后使用本地网络上网
网络环境大概是这样了:我在家里用ADSL上网,通过VPN连接到公司的服务器.但是连接VPN后,只能登录到公司的服务器,与INTERNET就断开了,QQ.网页都断开了.公司的服务器应该是连网的,可能被限 ...
- <% %> 、 <%= %> 、<%# %> 的区别
1,<% %>用来绑定后台代码 中间一般放函数或者方法,典型的asp程序写法. 在前台页面可以写后台代码 相当于开辟了C#空间,可以写C#代码 2,& ...
- python学习之路-12
线程池 上下文管理 线程池中关于上下文管理的相关代码 点我查看更详细的上下文管理介绍 import contextlib @contextlib.contextmanager def worker_s ...
- KafkaOffsetMonitor监控
介绍 KafkaOffsetMonitor是有由Kafka开源社区提供的一款Web管理界面,这个应用程序用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,你 ...
- Linux下使用JNI的常见问题及解决方案
JNI是java和C/C++混合编程的接口,可以很方便地实现java调用C/C++语言.具体的使用方法,网上有很多教程,在此不做过多介绍.本博客只关注在使用JNI的过程中的常见问题. 1. 生 ...
- Maven之——坐标和依赖(上)
Maven之--坐标和依赖(上) 1. Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到详细的构件.Maven的坐标元素包含groupId.artifactId.versi ...
- ZooKeeper的学习与应用
近期大概学习了一下ZooKeeper,本身并没有深入.LGG尝试着在虚拟机里面搭了平台,看了看一些教材,从网上到处看别人的博文并引用之,还请各位大牛们谅解我的剽窃.现总结例如以下. 1. ZooKee ...