问题标签 [boxing]

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 投票
9 回答
57799 浏览

language-agnostic - 什么是装箱和拆箱,权衡取舍是什么?

我正在寻找一个清晰、简洁和准确的答案。

理想情况下作为实际答案,尽管欢迎提供良好解释的链接。

0 投票
6 回答
5711 浏览

c# - C# 中的泛型接口会防止装箱吗?(.NET 与 Mono 性能)

我有一个 C# 接口,其中某些方法参数声明为object类型。但是,传递的实际类型可能因实现接口的类而异:

MyClass2 的问题在于byte[]to 和 from的转换object装箱和拆箱,这是影响性能的计算量大的操作。

通用接口解决这个问题会避免装箱/拆箱吗?

这是如何在 .NET 与 Mono 中实现的?在这两个平台上都会有任何性能影响吗?

谢谢!

0 投票
4 回答
2809 浏览

.net - 对值类型调用方法会导致 .NET 中的装箱吗?

我刚刚参加 Stack Overflow 问题.NET 中的所有内容都是对象吗?.

一位发帖人(在接受答案的评论中)似乎认为对值类型执行方法调用会导致装箱。他向我指出了Boxing and Unboxing (C# Programming Guide),它并没有准确地指定我们正在描述的用例。

我不是一个相信单一来源的人,所以我只是想获得关于这个问题的进一步反馈。我的直觉是没有拳击,但我的直觉确实很糟糕。:D

进一步阐述:

我使用的示例是:

如果所讨论的结构覆盖从对象继承的方法,则不会发生装箱,因为此处接受的答案表明。

但是,如果结构没有覆盖该方法,则会在 callvirt 之前执行“约束” CIL命令。根据文档OpCodes.Constrained Field这会导致装箱

如果 thisType 是一个值类型并且 thisType 没有实现方法,则 ptr 被取消引用,装箱,并作为“this”指针传递给 callvirt 方法指令。

0 投票
5 回答
1784 浏览

c# - 拳击,你的偏好是什么,你认为哪个更快?

简而言之,我认为拳击是一种烦恼。让我们看看一些替代方案......

System.Int32 派生自抽象类 System.ValueType,后者派生自 System.Object 类。您不能从 C# 中的 System.ValueType 派生,但我猜想 struct 关键字正是这样做的,并且 CLI 将这些类型定义识别为具有按值传递的语义。无论如何,当将结构分配给对象类型时,就会发生装箱。我不想陷入拳击本身,而是想直接进入它。

我查看了一些由 C# 编译器生成的 IL。

在 MSDN 上找到这个...

值类型在公共语言基础结构 (CLI) 中有两种不同的表示形式:

  • 当值类型嵌入另一个对象或堆栈时使用的“原始”形式。

  • 一种“盒装”形式,其中值类型中的数据被包装(盒装)到一个对象中,因此它可以作为独立实体存在。

这使我得出结论,编写这样的代码应该同样昂贵......

如果我打算将相同的值作为 System.Object 传递,我真的想每次都将 ValueType 拆箱和装箱吗?我的直觉告诉我不,但我真的找不到任何人愿意评论所有这些喋喋不休的好动机?

编辑

有人发现自己在这样做吗?我意识到它可能看起来很奇怪,但有一次我发现自己处于一个位置,我想基于几种不同的表示来抽象计算。我是这样做的,并使用 lambda 表达式。它与装箱并没有真正的关系,但它允许我将任何 ValueType(这个结构方便地以 8 字节对齐)视为一种单一类型“ReinterpretCast”。

0 投票
4 回答
1015 浏览

c# - 实例化“AS”关键字

我最近开始使用 JSON 和 ExtJs 框架,并且在示例中遇到了以下代码。

我们使用以下方法从前端检索信息:

然后在示例中,他们执行以下操作:

我以前从未见过像这样使用“as”关键字。这只是将 updatedConfig 变量显式装箱为 JavaScriptObject 的另一种形式,还是我对此不了解?

谢谢

0 投票
4 回答
504 浏览

c# - 关于拳击的问题

我知道拳击是一个流行的概念,有很多可用的信息,但我有几个问题我无法真正找到答案:

1)如果装箱导致值类型(结构)被转换为对象(引用类型)或引用类型,那么为什么要使用将被装箱并导致性能损失的值类型?我知道结构或类在某些情况下的好处和适用性。据说 (1) 值(值类型)倾向于在堆栈中的一个临时存储空间中存在,但要多长时间?如果我不需要该类型,我如何确保它在那个时候得到照顾和处置?或者这就是一次性模式发挥作用的地方?我认为使用结构的原因将是由于它的好处。

有趣的是,如果我使用一个结构来存储两个字符串和一个 DateTime 字段,那么该结构将同时保存两个引用(字符串)和 DateTime。我显然认为这比分散的值要快。在这个设计中有什么我需要注意的吗?(2)。

1) http://en.csharp-online.net/Classes, Structs, and Objects——装箱和拆箱

2) http://dotnetperls.com/Content/Struct-Examples.aspx

我在这里搜索了我想要的答案,但没有运气。我通常在这个站点上搜索诸如 GC、泛型、异常处理等主题,因为有很多智慧可以学习和分享。

感谢所有海报的(潜在)教育!请原谅任何潜在的天真。学习内部结构让我很好地花一些时间来理解 IL 等(很快要解决的问题)。

0 投票
2 回答
5318 浏览

c# - 枚举拳击和平等

为什么这会返回 False

虽然这返回 True?

0 投票
17 回答
100752 浏览

java - 将原始 long 数组转换为 Long 列表

这可能是一个简单的,headdesk 类型的问题,但我的第一次尝试出人意料地完全失败了。我想获取一组原始 long 并将其变成一个列表,我试图这样做:

这样做的正确方法是什么?

0 投票
6 回答
7285 浏览

c# - 拳击与拆箱

我最近遇到的另一个 C# 面试问题是我是否知道装箱和拆箱是什么。我解释了值类型在堆栈上,引用类型在堆上。当一个值被转换为引用类型时,我们称之为装箱,反之亦然。

然后他让我计算一下:

是什么i

我把它搞砸了,说 50,实际上是 20。现在我想明白为什么了,但是当我玩不同的组合时,我很惊讶地看到这个:

我也期待看到b == 2,但事实并非如此,为什么?是不是因为第二次装箱破坏并替换a了堆上的整个对象?

因为如果我这样做,那很好:

是什么t2.x?它应该是 3,它是。但这根本不是装箱/拆箱的例子,对吗?那么你会如何总结这一点呢?

在装箱/拆箱转换中,这些值是否会变得与上述相同?

0 投票
9 回答
7861 浏览

c# - 在 C# 中对值类型进行装箱的用例?

在某些情况下,需要将值类型的实例视为引用类型的实例。对于这种情况,可以通过一个称为装箱的过程将值类型实例转换为引用类型实例。当一个值类型实例被装箱时,存储在堆上分配并且实例的值被复制到那个空间中。对此存储的引用被放置在堆栈上。装箱的值是一个对象,一个包含值类型实例内容的引用类型。

了解 .NET 的通用类型系统

Wikipedia中有一个 Java 示例。但是在 C# 中,在哪些情况下必须将值类型装箱?或者一个更好/类似的问题是,为什么要将值类型存储在堆(装箱)而不是堆栈上?