- 2
- 0
- 约2.45万字
- 约 23页
- 2017-10-18 发布于天津
- 举报
C#不安全代码.doc
18. 不安全代码 PAGEREF _Toc113945913 \h 313
18.1 不安全上下文 PAGEREF _Toc113945914 \h 313
18.2 指针类型 PAGEREF _Toc113945915 \h 315
18.3 固定和可移动变量 PAGEREF _Toc113945916 \h 318
18.4 指针转换 PAGEREF _Toc113945917 \h 318
18.5 表达式中的指针 PAGEREF _Toc113945918 \h 319
18.5.1 指针间接寻址 PAGEREF _Toc113945919 \h 320
18.5.2 指针成员访问 PAGEREF _Toc113945920 \h 320
18.5.3 指针元素访问 PAGEREF _Toc113945921 \h 321
18.5.4 address-of 运算符 PAGEREF _Toc113945922 \h 322
18.5.5 指针递增和递减 PAGEREF _Toc113945923 \h 323
18.5.6 指针算术运算 PAGEREF _Toc113945924 \h 323
18.5.7 指针比较 PAGEREF _Toc113945925 \h 324
18.5.8 sizeof 运算符 PAGEREF _Toc113945926 \h 324
18.6 fixed 语句 PAGEREF _Toc113945927 \h 325
18.7 堆栈分配 PAGEREF _Toc113945928 \h 328
18.8 动态内存分配 PAGEREF _Toc113945929 \h 329
不安全代码
如前面几章所定义,核心 C# 语言没有将指针列入它所支持的数据类型,从而与 C 和 C++ 有着显著的区别。作为替代,C# 提供了各种引用类型,并能够创建可由垃圾回收器管理的对象。这种设计结合其他功能,使 C# 成为比 C 或 C++ 安全得多的语言。在核心 C# 语言中,不可能有未初始化的变量、“虚”指针或者超过数组的边界对其进行索引的表达式。这样,以往总是不断地烦扰 C 和 C++ 程序的一系列错误就不会再出现了。
尽管实际上对 C 或 C++ 中的每种指针类型构造,C# 都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指针的手段,就不可能或者至少很难完成。为了满足这样的需求,C# 提供了编写不安全代码 (unsafe code) 的能力。
在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换,还可以获取变量的地址,等等。在某种意义上,编写不安全代码很像在 C# 程序中编写 C 代码。
无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符 unsafe 明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。
不安全上下文
C# 的不安全功能仅用于不安全上下文中。不安全上下文是通过在类型或成员的声明中包含一个 unsafe 修饰符或者通过使用 unsafe-statement 引入的:
类、结构、接口或委托的声明可以包含一个 unsafe 修饰符,在这种情况下,该类型声明的整个文本范围(包括类、结构或接口的体)被认为是不安全上下文。
在字段、方法、属性、事件、索引器、运算符、实例构造函数、析构函数或静态构造函数的声明中,也可以包含一个 unsafe 修饰符,在这种情况下,该成员声明的整个文本范围被认为是不安全上下文。
unsafe-statement 使得可以在 block 内使用不安全上下文。该语句关联的 block 的整个文本范围被认为是不安全上下文。
下面显示了关联的语法扩展。为简洁起见,用省略号 (...) 表示前几章中出现过的产生式。
class-modifier:...unsafe
struct-modifier:...unsafe
interface-modifier:...unsafe
delegate-modifier:...unsafe
field-modifier:...unsafe
method-modifier:...unsafe
property-modifier:...unsafe
event-modifier:...unsafe
indexer-modifier:...unsafe
oper
原创力文档

文档评论(0)