千家信息网

C#中的固定和活动变量介绍

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"C#中的固定和活动变量介绍",在日常操作中,相信很多人在C#中的固定和活动变量介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C#中的固定和活动变量
千家信息网最后更新 2026年11月02日C#中的固定和活动变量介绍

这篇文章主要介绍"C#中的固定和活动变量介绍",在日常操作中,相信很多人在C#中的固定和活动变量介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C#中的固定和活动变量介绍"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

&和fixed将变量分为两类:C#固定的和活动的变量。

固定的变量***的存在并不会被GC的操作影响。(例如局部变量,值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段,基础数据数组)。

&取固定变量的地址是没有限制的。但是活动变量容易受GC的影响,其地址只能通过fixed来获得,并且地址仅会在整个fixed语句的周期持续有效。

静态字段也是活动变量。还有标记为ref或out的也是活动变量,即使这个参数是传递给固定参数的。***,通过间接指针引用的变量总是固定变量。

指针转换

在不安全上下文中,下面的转换是隐式的:
◆从任何指针类型到void*
◆从null到任何指针类型

除此之外,下面的转换都是显式的:
◆从任何指针类型到另外的指针类型
◆从sbyte, byte, short, ushort, int, uint, long, or ulong到其他类型
◆从任何类型到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 = 123456;  // undefined

下面的例子会打印出double的8字节的值:

usingSystem;  classTest  {  unsafestaticvoidMain(){  doubled=123.456e23;  unsafe{  byte*pb=(byte*)&d;  for(inti=0;i

打印结果取决于endian.

指针数组

在不安全上下文中,是允许指针数组的,只有几种用于其转换是允许的:
◆从任何数组类型到System.Array或是实现了其接口的隐式引用类型转换同样适用于指针数组。但是,任何试图通过System.Array或是实现了其接口访问数组元素都会引发一个 运行时错误,因为指针类型不能转化为object.
◆从一个一维数组类型S[]到System.Collections.Generic.IList或是到其基接口,任何显示或是隐式的转换都是不行的。因为指针类型不能被用作类型参数,还有没有从指针类型到非指针类型的转换。
◆从System.Array或是实现了其接口到任何数组类型显示引用转换适用于指针数组。
◆从System.Collections.Generic.IList或是到其基接口到一个一维数组类型T[],任何显示的转换都是不行的。原因同上面第2条。

还有就是对于foreach语句,不适用于指针数组。相反,下面的语句

foreach (V v in x) embedded-statement

中的x是一个数组类型T[,,…,],n是数组的维度减1,T和V是指针类型,被改写为:

{  T[,,…,]a=x;  Vv;  for(inti0=a.GetLowerBound(0);i0<=a.GetUpperBound(0);i0++)  for(inti1=a.GetLowerBound(1);i1<=a.GetUpperBound(1);i1++)  …  for(intin=a.GetLowerBound(n);in<=a.GetUpperBound(n);in++){  v=(V)a.GetValue(i0,i1,…,in);  embedded-statement  }  }

变量a,i0,i1,…对于x或者embedded-statement或者其余部分的代码是不可见的或是不可访问的。变量v在embedded-statement中是只读的。如果没有显示转换从T到V,那么就会有错误。如果x是个null,就会有空引用异常。

表达式中的指针

在不安全上下文中,一个表达式的值可以来自于一个指针类型;但是在上下文之外,会造成编译时期错误。

间接访问

一元的*表示一个指针,被用来获得指针指向的值。*用在void*类型表达式或是非指针类型表达式时,会造成编译期错误。

*被用在null指针时是由实现来决定的。不能保证在使用时会抛出System.NullReferenceException.

如果一个非法的值赋给指针,那么*的行为是不可预知的。

指针成员访问

在指针成员访问P->I中,P必须是除了void*之外的类型,I同时必须是一个可访问的成员。

P->I效果上相同于(*P)。I.例如:

usingSystem;  structPoint  {  publicintx;  publicinty;  publicoverridestringToString(){  return"("+x+","+y+")";  }  }  classTest  {  staticvoidMain(){  Pointpoint;  unsafe{  Point*p=&point;  p->x=10;  p->y=20;  Console.WriteLine(p->ToString());  }  }  }

或是

classTest  {  staticvoidMain(){  Pointpoint;  unsafe{  Point*p=&point;  (*p).x=10;  (*p).y=20;  Console.WriteLine((*p).ToString());  }  }  }

指针元素访问

在指针元素访问P[E]中,P必须是除了void*之外的类型,同时E必须能隐式的转换为int, uint, long, or ulong的表达式。

P[E]效果上同*(P + E)。例如:

classTest  {  staticvoidMain(){  unsafe{  char*p=stackallocchar[256];  for(inti=0;i<256;i++)p[i]=(char)i;  }  }  }  又如:  classTest  {  staticvoidMain(){  unsafe{  char*p=stackallocchar[256];  for(inti=0;i<256;i++)*(p+i)=(char)i;  }  }  }

到此,关于"C#中的固定和活动变量介绍"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

指针 类型 变量 数组 活动 C# 接口 表达式 面的 上下 上下文 参数 地址 结果 错误 学习 安全 元素 成员 语句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 广州淘业互联网络科技 互联网佳科技有限公司 没上市的科技互联网公司 互联网科技金融 上海致骋互联网科技 时间互联网络科技 互联网实体化科技化 中国互联网有什么科技含量 湖南诚度互联网科技有限公司 花神(南京)互联网科技有限公司 宜昌元轩互联网科技有限公司 链环科技传统企业怎么转型互联网 健康食品互联网创新科技园项目 长沙互联网科技 区块链结合互联网科技 产业互联网科技服务公司 广州百诚互联网科技有限公司官网 科技互联网专业务虚会材料 瑞安市蟠桃会互联网科技有限公司 互联网科技图片 友谊互联网络科技 天速互联网络科技有限公司 互联网科技实习生岗位职责 互联网金融科技公司干啥的 科技大学互联网 华中科技大学互联网的牛人 智帮互联网科技公司最近动向 互联网科技快讯热点 35岁以上互联网科技行业
0