问题标签 [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.
language-agnostic - 什么是装箱和拆箱,权衡取舍是什么?
我正在寻找一个清晰、简洁和准确的答案。
理想情况下作为实际答案,尽管欢迎提供良好解释的链接。
.net - 对值类型调用方法会导致 .NET 中的装箱吗?
我刚刚参加 Stack Overflow 问题.NET 中的所有内容都是对象吗?.
一位发帖人(在接受答案的评论中)似乎认为对值类型执行方法调用会导致装箱。他向我指出了Boxing and Unboxing (C# Programming Guide),它并没有准确地指定我们正在描述的用例。
我不是一个相信单一来源的人,所以我只是想获得关于这个问题的进一步反馈。我的直觉是没有拳击,但我的直觉确实很糟糕。:D
进一步阐述:
我使用的示例是:
如果所讨论的结构覆盖从对象继承的方法,则不会发生装箱,因为此处接受的答案表明。
但是,如果结构没有覆盖该方法,则会在 callvirt 之前执行“约束” CIL命令。根据文档OpCodes.Constrained Field,这会导致装箱:
如果 thisType 是一个值类型并且 thisType 没有实现方法,则 ptr 被取消引用,装箱,并作为“this”指针传递给 callvirt 方法指令。
c# - 拳击,你的偏好是什么,你认为哪个更快?
简而言之,我认为拳击是一种烦恼。让我们看看一些替代方案......
System.Int32 派生自抽象类 System.ValueType,后者派生自 System.Object 类。您不能从 C# 中的 System.ValueType 派生,但我猜想 struct 关键字正是这样做的,并且 CLI 将这些类型定义识别为具有按值传递的语义。无论如何,当将结构分配给对象类型时,就会发生装箱。我不想陷入拳击本身,而是想直接进入它。
我查看了一些由 C# 编译器生成的 IL。
在 MSDN 上找到这个...
值类型在公共语言基础结构 (CLI) 中有两种不同的表示形式:
当值类型嵌入另一个对象或堆栈时使用的“原始”形式。
一种“盒装”形式,其中值类型中的数据被包装(盒装)到一个对象中,因此它可以作为独立实体存在。
这使我得出结论,编写这样的代码应该同样昂贵......
如果我打算将相同的值作为 System.Object 传递,我真的想每次都将 ValueType 拆箱和装箱吗?我的直觉告诉我不,但我真的找不到任何人愿意评论所有这些喋喋不休的好动机?
编辑
有人发现自己在这样做吗?我意识到它可能看起来很奇怪,但有一次我发现自己处于一个位置,我想基于几种不同的表示来抽象计算。我是这样做的,并使用 lambda 表达式。它与装箱并没有真正的关系,但它允许我将任何 ValueType(这个结构方便地以 8 字节对齐)视为一种单一类型“ReinterpretCast”。
c# - 实例化“AS”关键字
我最近开始使用 JSON 和 ExtJs 框架,并且在示例中遇到了以下代码。
我们使用以下方法从前端检索信息:
然后在示例中,他们执行以下操作:
我以前从未见过像这样使用“as”关键字。这只是将 updatedConfig 变量显式装箱为 JavaScriptObject 的另一种形式,还是我对此不了解?
谢谢
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 等(很快要解决的问题)。
c# - 枚举拳击和平等
为什么这会返回 False
虽然这返回 True?
java - 将原始 long 数组转换为 Long 列表
这可能是一个简单的,headdesk 类型的问题,但我的第一次尝试出人意料地完全失败了。我想获取一组原始 long 并将其变成一个列表,我试图这样做:
这样做的正确方法是什么?
c# - 拳击与拆箱
我最近遇到的另一个 C# 面试问题是我是否知道装箱和拆箱是什么。我解释了值类型在堆栈上,引用类型在堆上。当一个值被转换为引用类型时,我们称之为装箱,反之亦然。
然后他让我计算一下:
是什么i
?
我把它搞砸了,说 50,实际上是 20。现在我想明白为什么了,但是当我玩不同的组合时,我很惊讶地看到这个:
我也期待看到b == 2
,但事实并非如此,为什么?是不是因为第二次装箱破坏并替换a
了堆上的整个对象?
因为如果我这样做,那很好:
是什么t2.x
?它应该是 3,它是。但这根本不是装箱/拆箱的例子,对吗?那么你会如何总结这一点呢?
在装箱/拆箱转换中,这些值是否会变得与上述相同?
c# - 在 C# 中对值类型进行装箱的用例?
在某些情况下,需要将值类型的实例视为引用类型的实例。对于这种情况,可以通过一个称为装箱的过程将值类型实例转换为引用类型实例。当一个值类型实例被装箱时,存储在堆上分配并且实例的值被复制到那个空间中。对此存储的引用被放置在堆栈上。装箱的值是一个对象,一个包含值类型实例内容的引用类型。
在Wikipedia中有一个 Java 示例。但是在 C# 中,在哪些情况下必须将值类型装箱?或者一个更好/类似的问题是,为什么要将值类型存储在堆(装箱)而不是堆栈上?