gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:28:15 25 4
gpt4 key购买 nike

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

我知道什么是装箱和拆箱,但我无法理解它的真正用途。为什么以及我应该在哪里使用它?

short s = 25;

object objshort = s; //Boxing

short anothershort = (short)objshort; //Unboxing

最佳答案

Why

拥有统一的类型系统并允许值类型对其底层数据的表示与引用类型表示其底层数据的方式完全不同(例如,int 只是一桶与引用类型完全不同的三十二位)。

可以这样想。您有一个 object 类型的变量 o。现在你有了一个 int,你想把它放到 o 中。 o 是对某处某物的引用,而 int 强调不是对某处某物的引用(毕竟,它只是一个数字)。因此,您要做的是:创建一个可以存储 int 的新 object,然后将对该对象的引用分配给 o .我们称这个过程为“装箱”。

因此,如果您不关心拥有一个统一的类型系统(即,引用类型和值类型具有非常不同的表示形式,并且您不想要一种通用的方式来“表示”这两者),那么您不需要需要拳击。如果您不关心让 int 表示它们的基础值(即,让 int 也成为引用类型并且只存储对其基础值的引用),那么您不需要不需要拳击。

where should I use it.

例如,旧的集合类型ArrayList 只吃object。也就是说,它只存储对生活在某处的事物的引用。没有装箱,您不能将 int 放入这样的集合中。但是通过拳击,你可以。

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

这是正确的:

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

这不是:

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

相反,您必须这样做:

double e = 2.718281828459045;
object o = e; // box
int 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);

在继续下一个句子之前先想一想。

如果你说 TrueFalse 很好!等等,什么?这是因为引用类型上的 == 使用引用相等性来检查引用是否相等,而不是基础值是否相等。这是一个很容易犯的危险错误。也许更微妙

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!装箱转换复制被装箱的值以解释行为差异。

关于c# - 为什么我们需要在 C# 中装箱和拆箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2111857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com