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 ...
随机推荐
- 手动启动angular
关于手动启动 angular 的问题 angular核心原理解析1:angular自启动过程 angular.element(document).ready(function() { angular. ...
- 【转】禁止seekbar的拖动事件
原文网址:http://blog.csdn.net/ansionnal/article/details/8229801 当然是可以的! 其实是 onTouchEvent 事件时,不让他传递事件就行了! ...
- JPA---一对一关系
在JPA中,使用@oneToOne来标示. package com.yl.demo1.bean.oneToone; import javax.persistence.CascadeType; impo ...
- 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息 1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url ...
- Ext入门学习系列(四)面板控件
第四章 使用面板 上节学习了Ext复杂对话框,更进一步了解了Ext的运行机制.本章重点来了解Ext所有控件的基础——面板控件. 一.Ext的面板是什么? 同样先来看看几个效果: 基本面板,点击右上角小 ...
- 3、Android应用程序签名及发布
一.问个问题,为何我们需要签名以及版本控制? 程序做好了,我们要放到Market上进行商业发布. 二.发布步骤 [准备发布] 1)移除log , 设置版本编号和名称. 2)签名,通过ADT工具. 3) ...
- Spring MVC @ModelAttribute
1.@ModelAttribute注释void返回值的方法 @Controller public class HelloModelController { @ModelAttribute public ...
- OWC控件的使用
环境:SQL Server 2005 Analysis Services + OWC 1.1 +Win 7 准备: 1.在SQL Server 2005 Analysis Services建好ola ...
- HDU-4699 Editor 数据结构维护
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 题意:开始有一个光标,每次有5中操作:1,光标当前位置插入一个数,2,光标当前位置删除一个,3, ...
- [学姿势]实验室搬砖+node学习
这周开始进行收尾工作,我当然没有进行核心技术的开发,主要负责的是对web端进行展示上的修修补补,主要包括添加VLC播放器.rtsp视频流以及一些js细节. 1.VLC 全称为Video Lan Cli ...