【c#教程】C# 不安全代码

C# 不安全代码

当一个代码块使用 unsafe 修饰符标记时,c# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。

指针变量

指针 是值为另一个变量的地址的变量,即,内存位置的直接地址。就像其他变量或常量,您必须在使用指针存储其他变量地址之前声明指针。

指针变量声明的一般形式为:

type *var-name;

登录后复制

以下是有效的指针声明:

int    *ip;    /* 指向一个整数 */double *dp;    /* 指向一个双精度数 */float  *fp;    /* 指向一个浮点数 */char   *ch     /* 指向一个字符 */

登录后复制

下面的实例说明了 C# 中使用了 unsafe 修饰符时指针的使用:

using System;namespace UnsafeCodeApplication{    class Program    {        static unsafe void Main(string[] args)        {            int var = 20;            int* p = &var;            Console.WriteLine("Data is: {0} ",  var);            Console.WriteLine("Address is: {0}",  (int)p);            Console.ReadKey();        }    }}

登录后复制

当上面的代码被编译和执行时,它会产生下列结果:

Data is: 20Address is: 99215364

登录后复制

您也可以不用声明整个方法作为不安全代码,只需要声明方法的一部分作为不安全代码。下面的实例说明了这点。

使用指针检索数据值

您可以使用 ToString() 方法检索存储在指针变量所引用位置的数据。下面的实例演示了这点:

using System;namespace UnsafeCodeApplication{   class Program   {      public static void Main()      {         unsafe         {            int var = 20;            int* p = &var;            Console.WriteLine("Data is: {0} " , var);            Console.WriteLine("Data is: {0} " , p->ToString());            Console.WriteLine("Address is: {0} " , (int)p);         }         Console.ReadKey();      }   }}

登录后复制

当上面的代码被编译和执行时,它会产生下列结果:

Data is: 20Data is: 20Address is: 77128984

登录后复制

传递指针作为方法的参数

您可以向方法传递指针变量作为方法的参数。下面的实例说明了这点:

using System;namespace UnsafeCodeApplication{   class TestPointer   {      public unsafe void swap(int* p, int *q)      {         int temp = *p;         *p = *q;         *q = temp;      }      public unsafe static void Main()      {         TestPointer p = new TestPointer();         int var1 = 10;         int var2 = 20;         int* x = &var1;         int* y = &var2;                  Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);         p.swap(x, y);         Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);         Console.ReadKey();      }   }}

登录后复制

当上面的代码被编译和执行时,它会产生下列结果:

Before Swap: var1: 10, var2: 20After Swap: var1: 20, var2: 10

登录后复制

使用指针访问数组元素

在 C# 中,数组名称和一个指向与数组数据具有相同数据类型的指针是不同的变量类型。例如,int *p 和 int[] p 是不同的类型。您可以增加指针变量 p,因为它在内存中不是固定的,但是数组地址在内存中是固定的,所以您不能增加数组 p。

因此,如果您需要使用指针变量访问数组数据,可以像我们通常在 C 或 C++ 中所做的那样,使用 fixed 关键字来固定指针。

下面的实例演示了这点:

using System;namespace UnsafeCodeApplication{   class TestPointer   {      public unsafe static void Main()      {         int[]  list = {10, 100, 200};         fixed(int *ptr = list)         /* 显示指针中数组地址 */         for ( int i = 0; i 

当上面的代码被编译和执行时,它会产生下列结果:

Address of list[0] = 31627168Value of list[0] = 10Address of list[1] = 31627172Value of list[1] = 100Address of list[2] = 31627176Value of list[2] = 200

登录后复制

编译不安全代码

为了编译不安全代码,您必须切换到命令行编译器指定 /unsafe 命令行。

例如,为了编译包含不安全代码的名为 prog1.cs 的程序,需在命令行中输入命令:

csc /unsafe prog1.cs

登录后复制

如果您使用的是 Visual Studio IDE,那么您需要在项目属性中启用不安全代码。

步骤如下:

通过双击资源管理器(Solution Explorer)中的属性(properties)节点,打开项目属性(project properties)。

点击 Build 标签页。

选择选项"Allow unsafe code"。

 以上就是【c#教程】C# 不安全代码的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2553720.html

(0)
上一篇 2025年3月6日 06:48:22
下一篇 2025年3月6日 06:48:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 【c#教程】C# 集合(Collection)

    C# 集合(Collection) 集合(collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。 集合…

    编程技术 2025年3月6日
    100
  • 【c#教程】C# 事件(Event)

    C# 事件(Event) 事件(event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。 通过事件使用委托 事件在类中声明且生成…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 索引器(Indexer)

    C# 索引器(Indexer) 索引器(indexer) 允许一个对象可以像数组一样被索引。当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。您可以使用数组访问运算符([ ])来访问该类的实例。 …

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 属性(Property)

    C# 属性(Property) 属性(property) 是类(class)、结构(structure)和接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为 域(field)。属性(property)是域(f…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 反射(Reflection)

    C# 反射(Reflection) 反射(reflection) 对象用于在运行时获取类型信息。该类位于 system.reflection 命名空间中,可访问一个正在运行的程序的元数据。 System.Reflection 命名空间包含了…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 特性(Attribute)

    C# 特性(Attribute) 特性(attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 文件的输入与输出

    C# 文件的输入与输出 一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个 流。 从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流 和 输出流。输入流用于从文件读取数据(读操作…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 异常处理

    C# 异常处理 异常是在程序执行期间出现的问题。c# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 正则表达式

    C# 正则表达式 正则表达式 是一种匹配输入文本的模式。.net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。 定义正则表达式 下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。 字符转义 字符…

    编程技术 2025年3月6日
    200
  • 【c#教程】C# 预处理器指令

    C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 C# 编译器没有一个…

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论