知识大全 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)

用C#去除代码的SourceSafe管理(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  三

知识大全 根据现有C#代码文件生成扩展代码文件

根据现有C#代码文件生成扩展代码文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  为什么在这里

知识大全 C#代码文件生成扩展代码文件的想法

C#代码文件生成扩展代码文件的想法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  看到这标题的朋

知识大全 自创C#扫雷代码

趣味编程:自创C#扫雷代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 C#操作消息队列的代码

C#操作消息队列的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这是一个关于C#操作消息队

知识大全 C#异步Socket代码示例

C#异步Socket代码示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面的代码示例演示如

知识大全 动态执行C#代码

动态执行C#代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  写这篇笔记的理由是因为上篇g提高

知识大全 C#过滤HTML代码

C#过滤HTML代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  publicstringNo

知识大全 C#代码实现DataTemplate

C#代码实现DataTemplate  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不得不说Da

知识大全 C#反射取值 源代码

C#反射取值源代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<summary&