分析C#不安全代码

C#是.Net平台上主流的开发语言,和经典的C/C++不同的是,C#所编写的代码是托管代码,由GC来管理内存,省去了new/delete的烦恼。但是,由于某些特殊的要求,比如和底层的操作系统接口,访问内存映射设备或者实现对时间要求苛刻的算法时,提供了C#不安全代码。

创新互联建站服务项目包括托里网站建设、托里网站制作、托里网页制作以及托里网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,托里网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到托里省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

不安全上下文

C#不安全代码只能写在不安全上下文中。

通过unsafe 修饰符可以修饰:
class, struct, interface, or delegate
field, method, property, event, indexer, operator, instance constructor, destructor, or static constructor
unsafe-statement-block

指针的类型

在不安全上下文中,指针类型和引用类型或是值类型一样。但是,指针类型可以用在不安全上下文之外的typeof中,虽然这么做不安全。

Type t = typeof(Int32*);返回的是System.Int32*
pointer-type:
unmanaged-type
void
unmanaged-type:
type

非托管类型不是引用类型,也不包含任何嵌套的引用类型的成员。

非托管类型就是下面的一种:
◆sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool.
◆Any enum-type.
◆Any pointer-type.
◆Any user-defined struct-type that contains fields of unmanaged-types only.

和C/C++不同的是,声明多个指针变量需要:

int *p1,*p2;

但是在C#中,int* p1,p2就声明了两个指针变量,并且*是在类型之后,不是在变量名之前。

和引用类型相同的是,指针可以为null(所有位为0),如果访问一个指向null的指针会引发不可预知的结果。

Void* 表示一个指针指向未知类型。因为指向未知类型,所以不能通过*来访为指向的变量,也不能对指针进行数学运算。但是,void*可以转换为任何指针类型,反之亦然。

指针类型是一个单独的类型。指针类型不是继承自System.Object,,并且两者也不能互相转换。同样装箱和拆箱也不适合指针类型。但是不同类型指针之间可以互相转换。

指针类型不能用于类型参数,当泛型方法的类型参数为指针类型会调用失败。

指针类型还可用于易变字段类型。

虽然指针还能通过ref和out来传递,但是会造成不可预知的行为,当指针指向一个已经不存在的本地变量,或是指向一个实际不再固定的固定对象。比如:

 
 
 
  1. usingSystem;
  2. classTest
  3. {
  4. staticintvalue=20;
  5. unsafestaticvoidF(outint*pi1,refint*pi2){
  6. inti=10;
  7. pi1=&i;
  8. fixed(int*pj=&value){
  9. //...
  10. pi2=pj;
  11. }
  12. }
  13. staticvoidMain(){
  14. inti=10;
  15. unsafe{
  16. int*px1;
  17. int*px2=&i;
  18. F(outpx1,refpx2);
  19. Console.WriteLine("*px1={0},*px2={1}",
  20. *px1,*px2);//undefinedbehavior
  21. }
  22. }
  23. }

方法可以返回指针类型。

 
 
 
  1. unsafestaticint*Find(int*pi,intsize,intvalue){
  2. for(inti=0;i;++i){
  3. if(*pi==value)
  4. returnpi;
  5. ++pi;
  6. }
  7. returnnull;
  8. }

主要有几个操作符:
◆ *被用作间接访问
◆ ->被用作通过指针来访为结构的成员
◆ []用来做指针的索引器
◆ &用来获得变量的地址
◆ ++和—用来自增和自减指针
◆ +和-用来做指针的算术运算
◆ ==, !=, <, >, <=, and =>用来比较指针
◆ stackalloc可以从栈上分配内存
◆fixed用来临时固定一个变量,所以它的地址总是可以得到的。以上介绍C#不安全代码

当前标题:分析C#不安全代码
网页路径:http://www.36103.cn/qtweb/news40/19990.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联