从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法。

不过,当你需要使用指针的时候,请通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文。 有关指针的更多信息,请参见主题指针类型

说明

在公共语言运行时 (CLR) 中,不安全代码是指无法验证的代码。 C# 中的不安全代码不一定是危险的;只是其安全性无法由 CLR 进行验证的代码。 因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。 如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错

不安全代码具有下列属性:

  • 方法、类型和可被定义为不安全的代码块。

  • 在某些情况下,通过移除数组界限检查,不安全代码可提高应用程序的性能。

  • 当调用需要指针的本机函数时,需要使用不安全代码。

  • 使用不安全代码将引起安全风险和稳定性风险。

  • 在 C# 中,为了编译不安全代码,必须用 /unsafe 编译应用程序。

unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。 有关更多信息,请参见 不安全代码和指针(C# 编程指南)

可以在类型或成员的声明中使用 unsafe 修饰符。 因此,类型或成员的整个正文范围均被视为不安全上下文。 例如,以下是用 unsafe 修饰符声明的方法:

 
unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
// Unsafe context: can use pointers here.
}

不安全上下文的范围从参数列表扩展到方法的结尾,因此指针在以下参数列表中也可以使用:

 
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

还可以使用不安全块从而能够使用该块内的不安全代码。 例如:

 
 
unsafe
{
// Unsafe context: can use pointers here.
}

若要编译不安全代码,必须指定 /unsafe 编译器选项。 无法通过公共语言运行时验证不安全代码。

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的“属性”页。

  2. 单击“生成”属性页。

  3. 选中“允许不安全代码”复选框。

有关如何以编程方式设置此编译器选项的信息,请参见 AllowUnsafeBlocks

编译不安全模式的 in.cs:

csc /unsafe in.cs
class UnsafeTest
{
// Unsafe method: takes pointer to int:
unsafe static void SquarePtrParam(int* p)
{
*p *= *p;
} unsafe static void Main()
{
int i = ;
// Unsafe method: uses address-of operator (&):
SquarePtrParam(&i);
Console.WriteLine(i);
}
}
// Output: 25

C#不安全代码和指针的更多相关文章

  1. day11基础代码——函数指针

    // //  main.m //  Demo11 // //  Created by scjy on 15/10/29. //  Copyright © 2015年 lizhipeng. All ri ...

  2. Essential C++ 3.1 节的代码练习——指针方式

    // // PointerToValue.cpp // Working // // Created by Hawkins, Dakota Y on 6/3/16. // Copyright 2016 ...

  3. C语言 指针小结

    指针 -->指针变量 类型名 *变量名 int *point1; char *point2; 注意:*p可以直接使用,它代表指针p指向的变量,*p可以当做被指向的变量使用!~~~~ 一个变量的地 ...

  4. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  5. UCOS 解读代码

    1.OSInit()函数:建立两个任务,一个是空闲任务,在任何任务没有就绪时运行,一个是统计任务,计算cpu的利用率.初始化 UCOSII 的所有变量和数据结构,2.OSTaskCreate 该函数返 ...

  6. C#不安全代码和stackalloc

    stackalloc 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块.如下: ]; 注意:关键字仅在局部变量的初始值中有效. 下面的代码导致编译器错误. int* block; // The ...

  7. c++中的指针问题

    c++和C语言一样,都有指针,指针通过变量的存储位置访问变量内容并进行修改,与引用不同的是,引用仅仅是给变量取一个别名,并不是一个对象,而指针则是一个对象. #include<iostream& ...

  8. 去除C/C++程序代码中的注释

    最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...

  9. 什么是野指针?(What is a wild pointer?)

    未被初始化的变量称为野指针(wild pointer).顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题. 理解下面的例子: int main() { int *p; ...

随机推荐

  1. 131. 132. Palindrome Partitioning *HARD* -- 分割回文字符串

    131. Palindrome Partitioning Given a string s, partition s such that every substring of the partitio ...

  2. SQL Server 一列或多列重复数据的查询,删除

    业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关 ...

  3. php像新浪微博一样生成短域名

    <?php function shorturl($url='', $prefix='', $suffix='') { $base32 = array ( 'a', 'b', 'c', 'd', ...

  4. 一个漂亮灵活的PHP图片验证码

    <?php class Imagecode{ private $width ; private $height; private $counts; private $distrubcode; p ...

  5. 设置正确的post数据格式

    之前一直使用苏飞的HttpHelper类来访问网络,用起来一直感觉很爽.使用其工具直接生成访问代码很是方便.直到昨天下午做到需要使用wpf来post两个字段数据到服务器,服务器使用ASP.NET MV ...

  6. JavaWeb chapter 1 http协议

    1.  静态web和动态web的区别: 静态web和动态web最本质的区别是静态web是无法进行数据库操作,而动态web是可以进行数据库操作的.动态web的最大特点就是具有交互性,所谓交互性就是服务器 ...

  7. js循环

    $('.xcarcoin_tb').each(function(i){ var aika='爱卡币';                if(data[i]==0){                }e ...

  8. java中的native方法和修饰符(转)

    Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...

  9. tableview_nav 动画效果

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat yOffset  = scrollView.contentOffset. ...

  10. C++-不要在构造和析构函数中调用虚函数

    在实习的单位搞CxImage库时不知为什么在Debug时没有问题,但是Release版里竟然跳出个Pure virtual function call error! 啥东西呀,竟然遇上了,就探个究竟吧 ...