C# 指针(unsafe与fixed的使用)
c#在默认情况下生成的都是安全代码,即进行了代码托管(.NET的CLR机制好处之一是,进行代码托管,适时的释放内存,程序员便不必考虑资源的回收问题),而此时,指针不能出现在安全代码的编译条件下。
一、unsafe
如果因需要想在c#中使用指针,那么unsafe便是一个通道(当然在使用前,需在项目属性的生成选项中,选择“允许不安全代码”)。
example 1:
a) 创建项目,项目属性->生成->选择“允许不安全代码”
b) 编写代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleDll
{
//此处为c++动态库的调用,因 DllC++.dll是示例测试文件,为不影响代码演示,此处屏蔽
//public class Code
//{
// [DllImport("DllC++.dll")]
// public unsafe static extern int Add(int a, int* b);
//}
class Program
{
public unsafe static int Add(int a, int* b)//此处使用 指针,需要加入非安全代码关键字unsafe
{
return a + *b;
}
static void Main(string[] args)
{
unsafe//此代码块为非安全代码,可以使用指针
{
int resDll,resInner, a;
int* b;//如果在安全代码条件下,编译不会通过对指针的定义
a = 1;
b = &a;
// resDll = Code.Add(a, b);
resInner = Add(a,b);
}
}
}
}
上面代码简单的示范了何种情况下可以使用指针。
二、fixed
fixed其实是在非安全代码下用到才会有意义的。因为他负责对指针所指向的“动态分配内存的对象或对象中的成员”简称“对象”进行锁定(之所以要锁 定,是因为即使在非安全代码模式下,这些对象一样的使用CLR的代码托管,这样的话,很可能造成对象的地址变动,就是因为CLR对资源重新分配的不确定 性,假使指针在未完成对对象的操作时,对象地址变动,那么指针指向的地址就会出现混乱,很可能造成内存泄漏甚至系统崩溃。如果使用fixed进行锁定,那 么只有在执行完fixed模块后,指针所指向的对象才能被移动)。
a) 垃圾回收机制,维护引用信息不维护指针信息
b) 引用类型的实例化对象在生存期内由垃圾回收机制处理,可能移动内存
c) 当一个类的实例化对象中含有值类型时,定义指向这些值类型的指针编译报error,因为这些内嵌在引用类型中的值类型实例会随着引用实例化对象的内存移动而移动,所以指针值在不知情的情况下会发生变化,fixed关键字做的工作便是让这样的类实例化对象(不是类类型本身,而是一个实例化对象)
example 2:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleDll
{ //例子1
unsafe void SquarePtrParam(int* p)
{
*p *= *p;
}
public unsafe void run()
{
int[] arr = new int[] { 1, 2, 3, 4, 5 };
fixed (int* p = &arr[0]) //此处将锁住arr[0],使得在fixed操作块内,arr[0]不会被CLR移动
{
for (int i = 0, n = arr.Length; i < n; i++)
{
SquarePtrParam(p + i);
Console.WriteLine(p[i]);
}
}
}
//例子2
public static int Add(int[] a,int b)
{
unsafe
{
fixed (int* pa = a)//此处将锁住a,使得在fixed操作块内,a不会被CLR移动
{
return *pa + b;
}
} }
static void Main(string[] args)
{
int[] a = new int[1];
a[0] = 1;
int b = 2;
int res = Add(a,b);
}
}
}
上述代码需注意的是:pa的地址也是被固定了的,所以不能对他进行赋值操作。
C# 指针(unsafe与fixed的使用)的更多相关文章
- c# 指针unsafe/fixed -- 【一】
指针C#unsafefixed 目录(?)[-] 概述 unsafe fixed 1.1 概述 unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的.可以在属性.方法.类的声明中使 ...
- C#中的Unsafe和Fixed
托管代码 (managed code):由公共语言运行库环境(而不是直接由操作系统)执行的代码.托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收.运行库类型检查和安全支持等.这些服务帮助提 ...
- Unity3D 使用C#指针unsafe
Unsafe code requires the `unsafe' command line option to be specified 在Unity开发中,如果涉及到指针的使用,需要自己定义预处理 ...
- C#通过unsafe来操作指针
这里不介绍unsafe的理论,这里单单介绍它的用法.如果要了解的更具体,可以看这篇大神的博文:C#通过指针操作图像 先从一个很简单的例子介绍: private void TestInptr() { u ...
- C#中指针的用法
(*) unsafe 和 fixed unsafe { ]; ; i < array.Length; i++) { array[i] = i; } fixed (int* p = array) ...
- C# unsafe code
(*) unsafe 和 fixed unsafe { ]; ; i < array.Length; i++) { arra ...
- [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
- 继续SecureString
上回写了关于SecureString的特征和为什么我们要使用它,这篇继续研究研究这个SecureString. **主要内容:** - SecureString与String之间的转换 - Secur ...
- C#联合Union的实现方式
一.基础篇 C#不像C++,他本身是没有联合Union的,但是可以通过手动控制结构体每个元素的位置来实现,这需要结合使用StructLayoutAttribute.LayoutKind以及FieldO ...
随机推荐
- PHP Apache Access Log 分析工具 拆分字段成CSV文件并插入Mysql数据库分析
现在需要分析访问日志,怎么办? 比如分析D:\Servers\Apache2.2\logs\access2014-05-22.log http://my.oschina.net/cart/针对这个问题 ...
- Java [leetcode 21]Merge Two Sorted Lists
题目描述: Merge two sorted linked lists and return it as a new list. The new list should be made by spli ...
- 实用Python 语句集(入门者入)
1. Python IDLE中切换当前路径 在Python自带的编辑器IDLE中或者Python shell中不能使用cd命令,那么跳到目标路径呢. 方法是使用os包下的相关函数实现路径切换功能. i ...
- android 图片全屏
方式一: 在xml的布局文件的根元素设置属性background 方式二: <ImageView android:layout_width="fill_parent&q ...
- IO_REMOVE_LOCK使用方法小结(转载加改正)
原文链接:http://www.programlife.net/io_remove_lock.html IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOV ...
- Javascript/15-1-14
1.break 语句用于跳出循环.break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话). continue 用于跳过循环中的一个迭代. 2.label:statements 用于直接跳 ...
- asp.net 分析器错误消息: 文件.aspx.cs”不存在错误
发布webapplication时后老是报告分析器错误消息: 文件.aspx.cs”不存在错误,差点抓狂,后来在网上搜到原因是: <%@ Page Language="C#" ...
- 配置OpenStack以使用LDAP实现身份管理
本文展示了如何配置 Keystone,以便使用轻量级目录http://www.aliyun.com/zixun/aggregation/34570.html">访问协议( LDAP)服 ...
- 给Qt应用程序添加图标文件ico setWindowIcon
1:通过qmake生成makefile实现过程: (1) 找到一张图片.ico,名字改为myappico.ico:注意:Qt5.2中 ico文件是256 * 256. (2) 创建一个新的文本文档,内 ...
- 浅析作用域链–JS基础核心之一
JS中的作用域,大家都知道的,分为全局作用域和局部作用域,没有块级作用域,听起来其实很简单的,可是作用域是否能够有深入的了解,对于JS代码逻辑的编写成功率,BUG的解决能力,以及是否能写出更优秀的代码 ...