知识大全 C#中的非安全编程

Posted 指针

篇首语:再长的路,一步步也能走完;再短的路,不迈开双脚也无法到达。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中的非安全编程相关的知识,希望对你有一定的参考价值。

C#中的非安全编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

 

  介绍

  这是C/C++程序迷们经常谈论的一个话题 同时也是一个复杂的 难以理解的话题-指针!每次谈到C# 大多数我遇到的人都持这样的观点-C#中没有指针的概念 而实际上 它已经被废除了 取而代之的是C#中的非安全编程-如何在程序中使用指针 不同于其字面意思的是 使用指针编程并没有什么不安全的

  它如此受关注的根本原因是 非安全编程不同于习惯的 NET开发规范 而需要编程人员进行明确定本地环境设置(仅适用于本地执行) 本文我将从区别两个最容易被疑惑的概念-非安全代码与非受控代码开始讨论非安全编程这个主题 接下来我们将讨论如何编写非安全代码 亦即如何在C#中使用指针

  非安全还是非受控?

  受控代码是指在CLR管理下执行的代码 CLR负责了许多幕后的工作

  管理对象的内存

  进行类型验证

  垃圾回收

  说了这些 实际就是要将用户从上述的这些工作中解脱出来了 专心于业务实现 用户不再需要直接手工地进行内存操作 因为这些工作已由CLR完成了

  另一方面 非受控代码就是在CLR上下文外执行的代码了 最好的例子就是我们平时使用的Win DLL 比如kernel dll user dll以及安装上我们系统上的各种组件 如何为它们分配内存 如何释放这些内存 如何实现类型验证?这些工作都需要它们自己来完成 一个典型的C++程序中分配一个字符指针的语句也是非受控代码的另一类例子 因为作为一名编程者 你要负责

  调用内存分配函数    确保类型转换的结果正确    确保指针在使用完毕后其内存被释放

  如果你留心上面的解释 所有这些工作都是由CLR来完成以减轻编程者的负担

  非安全代码是介于受控与非受控代码间的一种代码类型

  非安全代码仍然象受控代码一样是在CLR的管理下执行的 但在同时它又象非受控代码一样允许你通过指针直接访问内存 因此你获得了两者的优点 如果你正在编写写一个 NET应用程序 但同时又希望可以广泛使用Win DLL中的各种函数-需要使用指针的 那么此时非安全代码就是你的救星了

  我们已经明确了两者的区别后 就开始编写实际的代码 毫无疑问 这才是最精彩的部分 你还在想什么呢?  深入非安全代码

  编写非安全代码需要使用特殊的关键字unsafe与fixed 如果你还记得的话 有三种指针操作符

  *   &    >

  任何使用了上述任一指针操作符的语句 语句块或者函数都应用unsafe关键字标记为非安全代码 就象这样

  public unsafe void Triple(int *pInt) *pInt=(*pInt)* ;

  上面这个函数只是将传入的参数的值扩大了两倍 但是请注意 传入的是这个参数的指针!因为这个函数使用了 * 操作符直接进行内存操作 因此被标记为 unsafe

  但是这里还是有一个问题 回想一下上面的讨论 非安全代码也是在CLR管理下的受控代码 CLR可以自由地将对象移入内存中 于是一个似是而非的原因可能导致内存泄漏 这样做的结果是 对于编程者可能在自觉不自觉中使这个变量的指针指向内存的其他地方

  因此假设*pInt指向的地址是 而CLR的内存重定位过程将会引发内存泄漏 pInt之前指向 在重定位后其指向的数据可能被存储在地址 处 于是大祸临头了!pInt指向的 处存储的数据在经过重定位过程后无效了 这也许就是 NET很少提及指针的使用的原因吧 你认为呢?

  固定指针

  在语句块前输入关键字fixed 将会告诉CLR块内的对象不能重定位 这样CLR就不会重定位指针指向的数据存储位置 因此在C#中使用指针时 使用关键字fixed将能阻止程序运行时无效指针的产生 让我们看看它是如何工作的

  using System;class CData  public int x;

  class CProgram  unsafe static void SetVal(int *pInt)      *pInt= ;      public unsafe static void Main()      CData d = new CData();        Console WriteLine( Previous value: d x);        fixed(int *p=&d x)          SetVal(p);            Console WriteLine( New value: d x);  

  我们在这段代码里通过一个fixed块 将CData对象数据成员(域)x的地址赋给了一个整数型指针p 当fixed块中的语句被执行时 这个指针p将一直指向原来的那块内存区域 因为CLR已被指示暂时冻结这个变量直到该fixed块执行完毕 一旦fixed块执行完毕 这个对象就又能被CLR重新定位了

cha138/Article/program/net/201311/11476

相关参考

知识大全 浅析C#中的套接字编程

浅析C#中的套接字编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!大家都知道Java语言的强大功

知识大全 C#编程中的 New 关键词的几种用法

C#编程中的New关键词的几种用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 C#编程中的 New 关键词的几种用法[1]

C#编程中的New关键词的几种用法[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前段时间

知识大全 C#编程中的 New 关键词的几种用法[3]

C#编程中的New关键词的几种用法[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!newpub

知识大全 C#编程中的 New 关键词的几种用法[2]

C#编程中的New关键词的几种用法[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  以下是引

知识大全 C#语言学习:C#数据报编程之测试程序

C#语言学习:C#数据报编程之测试程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中自定

知识大全 C# 编程规范

C#编程规范  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一命名  用pascal规则来命名方

知识大全 叩开C#之门系列之C#与面向对象编程语言

叩开C#之门系列之C#与面向对象编程语言  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#是纯

知识大全 C#编程实现动态生成Word文档

C#编程实现动态生成Word文档  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何用C#编程实

知识大全 提高C#编程水平的50个要诀

提高C#编程水平的50个要诀  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提高C#编程水平的个