为什么我们需要在C#中装箱和拆箱?

为什么我们需要在C#中装箱和拆箱?,第1张

为什么我们需要在C#中装箱和拆箱?

为什么

要拥有统一的类型系统并允许值类型对其基础数据的表示形式与引用类型表示其基础数据的方式完全不同(例如,一个

int
只是三十二位的存储桶,它与引用完全不同)类型)。

这样想吧。您有一个

o
type
变量
object
。现在您有了一个,
int
并且想要将其放入
o
o
是对某处某物的引用,而
int
强调不是某处某物的引用(毕竟,它只是一个数字)。因此,您要执行的 *** 作是:创建一个
object
可以存储的新
int
对象,然后将对该对象的引用分配给
o
。我们称此过程为“装箱”。

因此,如果您不关心拥有统一的类型系统(即,引用类型和值类型具有非常不同的表示形式,并且您不希望使用通用的方式“表示”这两者),则无需装箱。如果您不在乎

int
表示其基础值(即也
int
可以是引用类型,而仅存储对其基础值的引用),则无需装箱。

我应该在哪里使用它。

例如,旧的集合类型

ArrayList
只吃
object
s。也就是说,它仅存储对生活在某处的事物的引用。如果没有装箱,您将无法放入
int
这样的收藏中。但是使用拳击,您可以。

现在,在泛型时代,您实际上并不需要它,并且通常可以在不考虑问题的情况下轻松进行。但是需要注意一些注意事项:

这是对的:

double e = 2.718281828459045;int ee = (int)e;

这不是:

double e = 2.718281828459045;object o = e; // boxint ee = (int)o; // runtime exception

相反,您必须执行以下 *** 作:

double e = 2.718281828459045;object o = e; // boxint ee = (int)(double)o;

首先,我们必须明确地取消

double
(double)o
)的装箱,然后将其转换为
int

以下是什么结果:

double e = 2.718281828459045;double d = e;object o1 = d;object o2 = e;Console.WriteLine(d == e);Console.WriteLine(o1 == o2);

在继续下一句话之前,请先考虑一下。

如果你说的

True
False
伟大!等一下
那是因为
==
在引用类型上使用引用相等性来检查引用是否相等,而不是基础值是否相等。这是容易犯的危险。也许更加微妙

double e = 2.718281828459045;object o1 = e;object o2 = e;Console.WriteLine(o1 == o2);

也会打印

False

最好说:

Console.WriteLine(o1.Equals(o2));

幸运的是,它将打印出来

True

最后一个微妙之处:

[struct|class] Point {    public int x, y;    public Point(int x, int y) {        this.x = x;        this.y = y;    }}Point p = new Point(1, 1);object o = p;p.x = 2;Console.WriteLine(((Point)o).x);

输出是什么?这取决于!如果

Point
是,
struct
则输出为;
1
如果
Point
是,
class
则输出为
2
!装箱转换将复制装箱的值,以解释行为上的差异。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4891375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存