问题标签 [unboxing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
417 浏览

.net - 将一个结构数组分配给另一个相同结构的数组

在 Vb.net 中,我试图将一个结构数组分配给另一个相同结构的数组

ifo 中的任何更改都会反映在 info2 中,此分配网络是由参考发生的。

我不希望信息的任何更改反映在 info2 中,反之亦然,在分配之后,我该如何实现?

0 投票
2 回答
594 浏览

java - Android上的装箱和拆箱

我正在开发一个 Android 应用程序。

我有以下界面:

对于在 上定义的每个表enum Table,它将是一个表示该表的对象。

我的问题是关于参数Object item。每次调用其中一种方法时,我都必须对每个项目进行拆箱,而且我不知道这对于 Android 是否会非常慢。

你知道更好的解决方案吗?我不想为每个表创建一个 DBAdapter,因为我应该在彼此之间共享 SQLiteDatabase 对象。

更新:

这是我需要传递给这些方法的对象示例:

谢谢。

0 投票
3 回答
1087 浏览

c# - 为什么拆箱枚举会产生奇怪的结果?

考虑以下::

2件事::

  1. 为什么我可以拆箱StringComparison?我想这是因为它的底层类型是Int32,但我仍然觉得它很奇怪。
  2. 为什么nullableEnum会有 null 值?

据我了解,唯一有效的拆箱是从装箱值类型到它的类型或可空类型。如果int可以取消装箱到Enum,那么为什么对于可空值不适用呢?同样,如果不是 5 I boxed StringComparison.OrdinalIgnoreCase,那nullableInt将是 null,但nullableEnum不会。

0 投票
4 回答
162 浏览

c# - 将 ValueType 声明为类的一部分时是否会被装箱?

考虑到这个类:

我猜“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,它必须肯定在托管堆中,但这是否意味着它每次使用时都被装箱和拆箱?

提前致谢

0 投票
6 回答
23692 浏览

c# - 使用泛型装箱和拆箱

.NET 1.0 创建整数集合的方式(例如)是:

使用它的代价是由于装箱和拆箱而缺乏类型安全性和性能。

.NET 2.0 的方式是使用泛型:

装箱的代价(据我所知)是需要在堆上创建一个对象,将堆栈分配的整数复制到新对象,反之亦然。

泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我猜不是这种情况,因为当它超出范围时会发生什么)?似乎仍然需要将它复制到堆栈之外的其他地方。

到底发生了什么?

0 投票
8 回答
5261 浏览

.net - 枚举如何从 System.Enum 派生并且同时是整数?

编辑:底部的评论。另外,.


这就是让我感到困惑的地方。我的理解是,如果我有这样的枚举......

...我基本上所做的是定义了一个用两个定义的值调用的值类型,并且. 此类型派生自引用类型(值类型通常不能做的事情——至少在 C# 中是不允许的——但在这种情况下是允许的),并且具有来回转换到值/从值转换的功能。AnimalDogCat System.Enumint

如果我刚才描述的枚举类型是真的,那么我希望下面的代码会抛出一个InvalidCastException

通常,您不能将值类型从System.Object它的确切类型以外的任何东西拆箱。那么以上怎么可能呢?就好像该Animal类型同时是一个int(不仅仅是可转换int)并且Enum不仅仅是可转换Enum)。是多重继承吗?是否System.Enum以某种方式继承自System.Int32(我没想到会发生的事情)?

编辑:它不能是上述任何一个。以下代码最终证明了这一点(我认为):

上述输出:

MSDN 关于枚举的文档和 C# 规范都使用了术语“底层类型”;但我不知道这是什么意思,我也从未听说过它用于指代枚举以外的任何东西。“基础类型”实际上是什么意思


那么,这是否是另一个从 CLR 获得特殊处理的案例

我的钱是在这种情况下......但答案/解释会很好。


更新Damien_The_Unbeliever提供了真正回答这个问题的参考。可以在 CLI 规范的第 II 部分中的枚举部分中找到解释:

出于绑定目的(例如,从用于调用它的方法引用中定位方法定义),枚举应与它们的底层类型不同。对于所有其他目的,包括验证和执行代码,未装箱的枚举可以自由地与其基础类型相互转换。枚举可以被装箱到对应的装箱实例类型,但是这种类型和底层类型的装箱类型一样,所以装箱不会丢失枚举的原始类型。

编辑(再次?!):等等,实际上,我不知道我第一次读对了。也许它并不能 100% 解释专门的拆箱行为本身(尽管我将 Damien 的回答视为已接受,因为它对这个问题有很大的了解)。我会继续研究这个...


另一个编辑:伙计,然后yodaj007 的回答让我陷入了另一个循环。不知何故,枚举与 ; 并不完全相同int。仍然int可以将 an 分配给没有强制转换的枚举变量吗?嗯?

我认为这一切最终都被汉斯的回答所阐明,这就是我接受它的原因。(对不起,达米安!)

0 投票
3 回答
1947 浏览

c# - 装箱/拆箱 - 只有值类型?Ref.types - 铸造?

从 MSDN 我读到装箱/拆箱是将类型视为对象。但是当我读到 ArrayList 时,它读到它也可以装箱。所以我很困惑,因为 ArrayList 将值和引用类型作为对象保存。此外,以下不是在术语方面的拆箱,它只是铸造?

0 投票
3 回答
15161 浏览

c# - Box和UnBox是什么意思?

可能的重复:
为什么我们需要在 C# 中装箱和拆箱?
什么是装箱和拆箱,权衡取舍是什么?

在 C# 中,sit 是什么意思:“Box and UnBox”?

这是我创建 Text 的 MSDN 的摘录。

但这种便利是有代价的。添加到 ArrayList 的任何引用或值类型都会隐式向上转换为 Object。如果项目是值类型,则在将它们添加到列表时必须将它们装箱,并在检索时取消装箱。铸造以及装箱和拆箱操作都会降低性能;在您必须迭代大型集合的情况下,装箱和拆箱的效果可能非常重要。

谢谢!

0 投票
4 回答
2912 浏览

c# - 在“out”参数中传递值类型是否会导致变量被装箱?

我知道装箱和拆箱在性能方面相对昂贵。我想知道的是:

将值类型传递给方法的out参数是否会导致变量的装箱/拆箱(从而影响性能)?编译器可以优化这个吗?

0 投票
4 回答
2718 浏览

c# - 在 C#/.NEt 中,动态类型占用的空间是否比对象少?

我有一个控制台应用程序,允许用户指定要处理的变量。这些变量有三种形式:string、double 和 long(double 和 long 是迄今为止最常用的类型)。用户可以以任何顺序指定他们喜欢的任何变量,因此我的系统必须能够处理它。为此,在我的应用程序中,我一直将它们存储为对象,然后根据需要进行转换/取消转换。例如:

我的理解是盒装对象比标准值类型占用更多的内存(大约 12 个字节)。

我的问题是:使用动态关键字存储这些值会更有效吗?它可能会解决装箱/拆箱问题,如果它更有效,这将如何影响性能?

编辑

为了提供一些上下文并防止在我最坏的情况下“你确定你使用了足够的 RAM 来担心这个”,我需要担心 420,000,000 个数据点(60 个变量 * 7,000,000 条记录)。这是我保留的关于每个变量的一堆其他数据(包括一些布尔值等)的补充。所以减少内存确实会产生巨大的影响。