C#在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
Unity 根据Excel生成C#脚本 发布于:2024-02-17 16:45 Test the "Value and Reference" program 发布于:2024-02-12 11:12 测试枚举类型 发布于:2024-02-08 17:29 获取用户名 发布于:2024-02-06 10:24 # 自定义委托 委托也是一种类,所以声明时与其它类是平级的。 ``` public delegate double Calc(double x, double y); public class HelloWorld { public static void Main() { } } ``` delegate 告诉编译器正在声明委托,double 表示目标方法的返回值类型,圆括号里是目标方法的参数列表。 委托于所封装的方法必须类型兼容。 发布于:2024-02-05 20:59 # Action委托和Func委托 Action委托只能委托没有返回值的方法。 Func委托则没有限制。 Func<参数类型,参数类型,...,返回值类型> func = new Func<参数类型,参数类型,...,返回值类型>(需要委托的函数); 委托的函数的参数类型和返回值类型,需要和Func<>中声明的相同。 发布于:2024-02-05 20:45 判断time赋值(百度c#吧某问题代码) 发布于:2024-01-30 15:38 测试js 生成hmac算法 发布于:2024-01-26 17:28 系统化untiy学习 发布于:2024-02-28 11:28 hmac 代码执行 发布于:2024-01-26 18:34 顺序查找法 发布于:2024-01-19 19:31 unity项目笔记 发布于:2024-01-22 13:27 简单的Func数据封装 发布于:2024-01-14 13:41 抽奖注册器 发布于:2023-12-28 16:48 测试功能xin 发布于:2023-12-25 20:41 C#初学-学习代码语法 发布于:2023-12-14 17:46 unity 面试 发布于:2024-01-23 17:14 基数排序的设计 发布于:2023-12-12 22:43 散列表避免重复投票 发布于:2023-12-12 00:01 基数排序算法 发布于:2023-12-11 23:40 判断闰年月份 发布于:2023-12-08 17:29 #include <iostream> #include <chrono> #include <thread> int main() { std::cout << "延迟输出前的消息" << std::endl; // 设置延迟时间为3秒 std::chrono::seconds delay(3); // 让线程睡眠3秒 std::this_thread::sleep_for(delay); std::cout << "延迟输出后的消息" << std::endl; return 0; } 发布于:2023-12-07 10:45 计数排序算法 发布于:2023-12-04 00:08 堆排序算法 发布于:2023-11-28 00:14 快速排序算法 发布于:2023-11-13 22:21 归并排序逆序对 发布于:2023-11-06 15:39 归并排序算法 发布于:2023-11-06 14:07 计算日期间隔 发布于:2023-11-01 16:07 二维数组旋转 发布于:2023-10-30 11:30 C# 事件何存 发布于:2023-10-29 08:22 C#控制台模拟器 发布于:2023-10-23 09:22 九九乘法表 发布于:2023-10-17 22:11 折半查找方法 发布于:2023-10-15 14:08 插入排序算法 发布于:2023-10-15 10:14 折半查找算法 发布于:2023-10-15 10:12 插入排序法 发布于:2023-10-10 16:49 这是好的的一段学习程序 发布于:2023-10-11 22:13 IEnumerator 接口learn 发布于:2023-10-07 19:18 背包问题算法 发布于:2023-10-06 15:52 蛮力匹配字符串算法 发布于:2023-10-06 15:45 一、匹配字符串问题代码实现 发布于:2023-10-05 13:16 c#多线程学习 发布于:2023-10-04 18:32 面向对象编程 发布于:2023-09-24 17:57 冒泡排序和选择排序 发布于:2023-09-24 17:18 这是一个事件 发布于:2023-09-24 15:52 这是一个委托 发布于:2023-09-24 15:50 21123049谢钊强 发布于:2023-09-24 15:47 这是一个接口 发布于:2023-09-24 15:48 这是一个OBject 发布于:2023-09-24 15:43 Null运算符 发布于:2023-09-24 15:20 [更多]
显示目录

不安全代码



C# 不安全代码

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

指针变量

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

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

type *var-name;

下面是指针类型声明的实例: 下面是指针类型声明的实例:

实例 描述
int* p p 是指向整数的指针。
double* p p 是指向双精度数的指针。
float* p p 是指向浮点数的指针。
int** p p 是指向整数的指针的指针。
int*[] p p 是指向整数的指针的一维数组。
char* p p 是指向字符的指针。
void* p p 是指向未知类型的指针。

在同一个声明中声明多个指针时,星号 * 仅与基础类型一起写入;而不是用作每个指针名称的前缀。 例如:

int* p1, p2, p3;     // 正确 
int *p1, *p2, *p3;   // 错误

下面的实例说明了 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: 20
Address 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: 20
Data is: 20
Address 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: 20
After 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 < 3; i++)
                {
                    Console.WriteLine("Address of list[{0}]={1}", i, (int)(ptr + i));
                    Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
                }
            Console.ReadKey();
        }
    }
}

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

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

编译不安全代码

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

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

csc /unsafe prog1.cs

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

步骤如下:

  • 通过双击资源管理器(Solution Explorer)中的属性(properties)节点,打开项目属性(project properties)
  • 点击 Build 标签页。
  • 选择选项"Allow unsafe code"。
由JSRUN为你提供的C#在线运行、在线编译工具
        JSRUN提供的C# 在线运行,C# 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout