知识大全 C#之不安全代码(1)
Posted 指针
篇首语:不要什么话都跟别人讲,你说的是心里话,他们听的是笑话。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#之不安全代码(1)相关的知识,希望对你有一定的参考价值。
C#之不安全代码(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
主要参考的是C# Language Specification Version
引子
C#是 Net平台上主流的开发语言 和经典的C/C++不同的是 C#所编写的代码是托管代码 由GC来管理内存 省去了new/delete的烦恼 但是 由于某些特殊的要求 比如和底层的操作系统接口 访问内存映射设备或者实现对时间要求苛刻的算法时 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(Int *) 返回的是System Int *
指针类型是用非托管类型或是void加上*来表示的 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
例子 Example Description byte* Pointer to byte char* Pointer to char int** Pointer to pointer to int int*[] Single dimensional array of pointers to int void* Pointer to unknown type
和C/C++不同的是 声明多个指针变量需要
int *p *p
但是在C#中 int* p p 就声明了两个指针变量 并且*是在类型之后 不是在变量名之前
和引用类型相同的是 指针可以为null(所有位为 ) 如果访问一个指向null的指针会引发不可预知的结果
Void* 表示一个指针指向未知类型 因为指向未知类型 所以不能通过*来访为指向的变量 也不能对指针进行数学运算 但是 void*可以转换为任何指针类型 反之亦然
指针类型是一个单独的类型 指针类型不是继承自System Object 并且两者也不能互相转换 同样装箱和拆箱也不适合指针类型 但是不同类型指针之间可以互相转换
指针类型不能用于类型参数 当泛型方法的类型参数为指针类型会调用失败
指针类型还可用于易变字段类型
虽然指针还能通过ref和out来传递 但是会造成不可预知的行为 当指针指向一个已经不存在的本地变量 或是指向一个实际不再固定的固定对象 比如 using System;
class Test static int value = ;
unsafe static void F(out int* pi ref int* pi ) int i = ; pi = &i;
fixed (int* pj = &value) // pi = pj;
static void Main() int i = ; unsafe int* px ; int* px = &i;
F(out px ref px );
Console WriteLine( *px = *px = *px *px ); // undefined behavior 方法可以返回指针类型 unsafe static int* Find(int* pi int size int value) for (int i = ; i < size; ++i) if (*pi == value) return pi; ++pi; return null; 主要有几个操作符
· *被用作间接访问
· >被用作通过指针来访为结构的成员
· []用来做指针的索引器
· &用来获得变量的地址
· ++和—用来自增和自减指针
· +和 用来做指针的算术运算
· == != < > <= and =>用来比较指针
· stackalloc可以从栈上分配内存
cha138/Article/program/net/201311/11442相关参考
用C#去除代码的SourceSafe管理(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 经
根据现有C#代码文件生成扩展代码文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 为什么在这里
C#代码文件生成扩展代码文件的想法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 看到这标题的朋
趣味编程:自创C#扫雷代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
C#操作消息队列的代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这是一个关于C#操作消息队
C#异步Socket代码示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下面的代码示例演示如
动态执行C#代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 写这篇笔记的理由是因为上篇g提高
C#过滤HTML代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! publicstringNo
C#代码实现DataTemplate 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 不得不说Da
C#反射取值源代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ///<summary&