c#入门-非托管结构
admin
2024-04-21 14:07:07

装箱

如果把值类型用于给引用类型赋值,
首先会复制这个值类型的内容放在堆上,然后把这个值的地址传回来给引用类型赋值,
但是之后如果再把这个引用类型赋值给其他引用类型,那么不会复制内容,只会直接复制地址。

interface IPoint
{public int X { get; set; }public int Y { get; set; }
}
struct Point : IPoint
{public int X;public int Y;int IPoint.X { get => X; set => X = value; }int IPoint.Y { get => Y; set => Y = value; }
}
Point p = new Point();
IPoint ip = p;
p.X = 40;
Console.WriteLine(ip.X);//得到40,说明他们的值已经没有关系了IPoint ip2 = ip;
Console.WriteLine(ip2.X);//得到0,也就是ip的值
ip.X = 20;
Console.WriteLine(ip2.X);//得到20,说明和ip是共用的值

拆箱

反过来如果值是引用类型,而被赋值的变量类型是值类型,
那么在赋值的时候也会经历一次复制。

装箱和拆箱的主要运用,是作为程序效率优化的地方。
装箱和拆箱多了一步地址解析,会影响效率。对int类型而言大约是10倍时间花费。

非托管结构

在结构前使用ref修饰,可以创建非托管结构。非托管结构无法被装箱,必定存在于栈上。
为了保证非托管结构无法被装箱,他有很多的使用要求:

  1. 不能声明类型为ref结构的数组
  2. 除非是另一个ref结构,否则不能声明ref结构类型的字段
  3. ref结构不能实现接口
  4. ref 结构不能被给 System.ValueType 或 System.Object 赋值。
  5. ref 结构不能是泛型的类型参数。
  6. ref 结构变量不能由 lambda 表达式或本地函数捕获。
  7. ref 结构变量不能在 async 方法中使用。 但是,可以在同步方法中使用 ref 结构变量,例如,在返回 Task 或 Task的方法中使用结构变量。
  8. ref 结构变量不能在迭代器中使用。

相关内容

热门资讯

别再说没机会当主角!这108弯... 3月11日,香格里拉巴拉格宗景区“天路108・从心出发”自驾体验启动仪式成功举行。大理融媒联合车商、...
图游天下 发现苏州|玉兰花开春... 春满姑苏,玉兰竞放。古典园林与与粉白花朵相映成趣,勾勒出独属江南的春日画卷。 想赴一场玉兰之约吗?小...
什么咖啡更适合新手喝?入门时怎... 很多人开始认真接触咖啡,往往都是从“想提神”慢慢走到“想喝懂”。 一开始可能只是喝速溶、点外卖咖啡,...
卤鸡胗终极秘诀:如何让鸡胗无腥... 你是否也曾在聚会中品尝过美味的卤鸡胗,忍不住想知道它的秘密?今天,就让我来揭开卤鸡胗的制作秘籍,让你...
原创 面... 一碗面条的逆袭之路 "面条除了煮和炒,还能怎么吃?"这个问题困扰了我很久。直到去年在街边小摊吃到那份...