欢迎来到天天文库
浏览记录
ID:23650032
大小:154.44 KB
页数:23页
时间:2018-11-09
《《c不安全代码》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、18.不安全代码31318.1不安全上下文31318.2指针类型31518.3固定和可移动变量31818.4指针转换31818.5表达式中的指针31918.5.1指针间接寻址32018.5.2指针成员访问32018.5.3指针元素访问32118.5.4address-of运算符32218.5.5指针递增和递减32318.5.6指针算术运算32318.5.7指针比较32418.5.8sizeof运算符32418.6fixed语句32518.7堆栈分配32818.8动态内存分配3291.不安全代码如前面几章所定义,核心C#语言没有将指针列入它所
2、支持的数据类型,从而与C和C++有着显著的区别。作为替代,C#提供了各种引用类型,并能够创建可由垃圾回收器管理的对象。这种设计结合其他功能,使C#成为比C或C++安全得多的语言。在核心C#语言中,不可能有未初始化的变量、“虚”指针或者超过数组的边界对其进行索引的表达式。这样,以往总是不断地烦扰C和C++程序的一系列错误就不会再出现了。尽管实际上对C或C++中的每种指针类型构造,C#都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指
3、针的手段,就不可能或者至少很难完成。为了满足这样的需求,C#提供了编写不安全代码(unsafecode)的能力。在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换,还可以获取变量的地址,等等。在某种意义上,编写不安全代码很像在C#程序中编写C代码。无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符unsafe明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。1.1不安全上下文C#的不安全功能仅用于不安全上下文中。不安全上下文是通过在类
4、型或成员的声明中包含一个unsafe修饰符或者通过使用unsafe-statement引入的:·类、结构、接口或委托的声明可以包含一个unsafe修饰符,在这种情况下,该类型声明的整个文本范围(包括类、结构或接口的体)被认为是不安全上下文。·在字段、方法、属性、事件、索引器、运算符、实例构造函数、析构函数或静态构造函数的声明中,也可以包含一个unsafe修饰符,在这种情况下,该成员声明的整个文本范围被认为是不安全上下文。·unsafe-statement使得可以在block内使用不安全上下文。该语句关联的block的整个文本范围被认为是不安
5、全上下文。下面显示了关联的语法扩展。为简洁起见,用省略号(...)表示前几章中出现过的产生式。class-modifier:...unsafestruct-modifier:...unsafeinterface-modifier:...unsafedelegate-modifier:...unsafefield-modifier:...unsafemethod-modifier:...unsafeproperty-modifier:...unsafeevent-modifier:...unsafeindexer-modifier:...un
6、safeoperator-modifier:...unsafeconstructor-modifier:...unsafedestructor-declaration:attributesoptexternoptunsafeopt~identifier()destructor-bodyattributesoptunsafeoptexternopt~identifier()destructor-bodystatic-constructor-modifiers:externoptunsafeoptstaticunsafeoptexternopt
7、staticexternoptstaticunsafeoptexternoptstaticunsafeoptstaticexternoptunsafeoptstaticunsafeoptexternoptembedded-statement:...unsafe-statementunsafe-statement:unsafeblock在下面的示例中publicunsafestructNode{publicintValue;publicNode*Left;publicNode*Right;}在结构声明中指定的unsafe修饰符导致该结构声明的
8、整个文本范围成为不安全上下文。因此,可以将Left和Right字段声明为指针类型。上面的示例还可以编写为publicstructNode{publicintValue;publi
此文档下载收益归作者所有