unsafe,fixed与GCHandle

1.unsafe

为了保持类型安全,默认情况下,C# 不支持指针运算。

在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码。C# 中的不安全代码不一定是危险的,只是其安全性无法由 CLR 进行验证的代码。因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错误.

unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。

可以在 类型或成员,块内 声明中使用 unsafe 修饰符

若要编译不安全代码,必须指定 /unsafe 编译器选项。 无法通过公共语言运行时验证不安全代码。

static void Main(string[] args)
        {
            unsafe
            {
                int* i; //指向int的指针
                int** j;//指向int指针的指针
                int x = 1;
                i = &x;  //指向x
                j = &i;

                Console.WriteLine("x地址:{0}",(int)i);
                Console.WriteLine("指针i的地址:{0}", (int)j);
                Console.WriteLine("i指向的值:{0}",*i);
                Console.WriteLine("j指向的最终值:{0}", **j);
            }
            Console.Read();
        }

http://msdn.microsoft.com/zh-cn/library/t2yzs44b(v=vs.80).aspx

2.fixed

http://hi.baidu.com/jiang_yy_jiang/item/d0a162f12f4df6c0a835a2d3

3.GCHandle:提供用于从非托管内存访问托管对象的方法

Test t=new Test();
GCHandle hander = GCHandle.Alloc(t);
var pin = GCHandle.ToIntPtr(hander);
时间: 2024-10-16 01:15:33

unsafe,fixed与GCHandle的相关文章

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

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

C# JackLib系列之字体使用

字体的使用一般我们都是使用系统字体,这样比较方便,直接 Font font=new Font("微软雅黑",16f,FontStyle.Bold); 但是当我们用到一个系统没有的字体库时,这个方法就不好用了,因此我们可以采用动态加载字体文件的方式或者直接把字体打包到我们的程序集里当作资源来使用: 下面我们来看一下怎么用: 我封装了一个类,大家可以直接使用,如果有不好的地方,欢迎大家指正. using System; using System.Collections.Generic; u

那些年我们赚过的外快(POS(移动支付)接口开发)

老规矩上前戏了.在我写博文"那些年我们赚过的外快"前后算起来大大小小也接了些私活,这次是因为好久没写博客了,趁热分享一下.最近回了离老家近的二线城市成都工作,收入那是下降很多啊,刚开始老婆还没说什么,随着开始还房贷和债务,生活开始捉襟见肘了.哎,最近都在发愁怎么增加收入!自己的想法是:1.争取多做几个安卓app出来发布到各大市场,靠植入广告赚点白菜钱.(还没验证过是否可行) 2.把之前积累好多年的行业管理软件的需求整理成几个软件,或基于云服务打造几款共享软件.(竞争很激烈啊,容易死在沙

[转]将字体嵌入程序资源中 C# Winform

http://social.msdn.microsoft.com/Forums/officeapps/zh-CN/61b717ae-f925-443a-baad-2b85f2564826/cwinformsvs2010 namespace WindowsFormsApplication2 { public partial class Form1 : Form { PrivateFontCollection pfc = new PrivateFontCollection(); public For

【C#学习笔记】指针使用

using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { int a = 5; unsafe { int* pa = &a; Console.WriteLine(*pa); } /************************************************************************/ int[] b = new int[1

Equals和GetHashcode

一.两个逻辑上相等的实例对象. 两个对象相等,除了指两个不同变量引用了同一个对象外,更多的是指逻辑上的相等.什么是逻辑上相等呢?就是在一定的前提上,这两个对象是相等的.比如说某男生叫刘益红,然后也有另外一个女生叫刘益红,虽然这两个人身高,爱好,甚至性别上都不相同,但是从名字上来说,两者是相同的.Equals方法通常指的就是逻辑上相等. 二.Object的GetHashcode方法. 计算Hashcode的算法中,应该至少包含一个实例字段.Object中由于没有有意义的实例字段,也对其派生类型的字

C#运算符大全_各种运算符号的概述及作用

一.[]方括号 ([]) 用于数组.索引器和属性,也可用于指针. 1.数组类型是一种后跟 [] 的类型:int[] fib = new int[100]; //创建一个有100元素的数组若要访问数组的一个元素,则用方括号括起所需元素的索引:fib[0] = fib[1] = 1;for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2];// 如果数组索引超出范围,则会引发异常. 2.不能重载数组索引运算符:但类型可以定义采用一个或多个参数的索

C#编程(七十五)----------C#使用指针

原文链接: http://blog.csdn.net/shanyongxu/article/details/47321441 在C#中使用指针的语法 如果想在C#中使用指针,首先对项目进行过配置: 看到属性了吗?单击: 看到那个允许不安全代码了吗?选中 然后将有关指针,地址的操作放在unsafe语句块中.使用unsafe关键字是告诉编译器这里的代码是不安全的. unsafe关键字的使用: (1)放在函数前,修饰函数,说明在函数内部或函数的形参涉及到指针操作: unsafe static void

C#中byte[] 与指针

本文假定读者熟悉byte[].指针. C#是类型安全的,默认是不允许使用指针,但是针对C\C++或者其他语言的程序员(delphi)转为使用C#的的工作人员,不适用指针觉得很别扭.下面介绍一下基础的指针.作为只是的备用. 具体代码: int [] bs = { 1,4,6,7,9,3,0,10,23,45,65,11,98}; //(1).初始位置 unsafe{ fixed (int* parr = bs) { MessageBox.Show("parr的地址为:" + Conver