知识大全 C#之不安全代码(2)
Posted 指针
篇首语:不是我不会,只是我没学。个人因学习而强大。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#之不安全代码(2)相关的知识,希望对你有一定的参考价值。
C#之不安全代码(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
固定的和活动的变量
&和fixed将变量分为两类 固定的和活动的
固定的变量永久的存在并不会被GC的操作影响 (例如局部变量 值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段 基础数据数组)
&取固定变量的地址是没有限制的 但是活动变量容易受GC的影响 其地址只能通过fixed来获得 并且地址仅会在整个fixed语句的周期持续有效
静态字段也是活动变量 还有标记为ref或out的也是活动变量 即使这个参数是传递给固定参数的 最后 通过间接指针引用的变量总是固定变量
指针转换
在不安全上下文中 下面的转换是隐式的
l 从任何指针类型到void*
l 从null到任何指针类型
除此之外 下面的转换都是显式的
l 从任何指针类型到另外的指针类型
l 从sbyte byte short ushort int uint long or ulong到其他类型
l 从任何类型到sbyte byte short ushort int uint long or ulong
指针转换并不改变指针的值 也就是说指针转换前后不影响地址的值
当转换发生后 当结果指针没有按照正确的指针类型排列的话 当访问结果时结果是无法预知的
下面的例子 char c = A ; char* pc = &c; void* pv = pc; int* pi = (int*)pv; int i = *pi; // undefined *pi = ; // undefined 下面的例子会打印出double的 字节的值 using System; class Test unsafe static void Main() double d = e ; unsafe byte* pb = (byte*)&d; for (int i = ; i < sizeof(double); ++i) Console Write( :X *pb++); Console WriteLine();
打印结果取决于endian
指针数组
在不安全上下文中 是允许指针数组的 只有几种用于其转换是允许的
l 从任何数组类型到System Array或是实现了其接口的隐式引用类型转换同样适用于指针数组 但是 任何试图通过System Array或是实现了其接口访问数组元素都会引发一个 运行时错误 因为指针类型不能转化为object
l 从一个一维数组类型S[]到System Collections Generic IList<T>或是到其基接口 任何显示或是隐式的转换都是不行的 因为指针类型不能被用作类型参数 还有没有从指针类型到非指针类型的转换
l 从System Array或是实现了其接口到任何数组类型显示引用转换适用于指针数组
l 从System Collections Generic IList<T>或是到其基接口到一个一维数组类型T[] 任何显示的转换都是不行的 原因同上面第 条
还有就是对于foreach语句 不适用于指针数组 相反 下面的语句
foreach (V v in x) embedded statement
中的x是一个数组类型T[ … ] n是数组的维度减 T和V是指针类型 被改写为 T[ … ] a = x; V v; for (int i = a GetLowerBound( ); i <= a GetUpperBound( ); i ++) for (int i = a GetLowerBound( ); i <= a GetUpperBound( ); i ++) … for (int in = a GetLowerBound(n); in <= a GetUpperBound(n); in++) v = (V)a GetValue(i i … in); embedded statement 变量a i i …对于x或者embedded statement或者其余部分的代码是不可见的或是不可访问的 变量v在embedded statement中是只读的 如果没有显示转换从T到V 那么就会有错误 如果x是个null 就会有空引用异常
表达式中的指针
在不安全上下文中 一个表达式的值可以来自于一个指针类型 但是在上下文之外 会造成编译时期错误
间接访问
一元的*表示一个指针 被用来获得指针指向的值 *用在void*类型表达式或是非指针类型表达式时 会造成编译期错误
*被用在null指针时是由实现来决定的 不能保证在使用时会抛出System NullReferenceException
如果一个非法的值赋给指针 那么*的行为是不可预知的
指针成员访问
在指针成员访问P >I中 P必须是除了void*之外的类型 I同时必须是一个可访问的成员
P >I效果上相同于(*P) I 例如 using System;struct Point public int x; public int y; public override string ToString() return ( + x + + y + ) ; class Test static void Main() Point point; unsafe Point* p = &point; p >x = ; p >y = ; Console WriteLine(p >ToString()); 或是 class Test static void Main() Point point; unsafe Point* p = &point; (*p) x = ; (*p) y = ; Console WriteLine((*p) ToString()); 指针元素访问
在指针元素访问P[E]中 P必须是除了void*之外的类型 同时E必须能隐式的转换为int uint long or ulong的表达式
cha138/Article/program/net/201311/12670相关参考
用C#去除代码的SourceSafe管理(2) 以下文字资料是由(全榜网网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&