问题标签 [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.
c# - 扩展 System.Object 时如何避免装箱/拆箱?
我正在研究一种仅适用于引用类型的扩展方法。但是,我认为,它目前正在对值进行装箱和拆箱。我怎样才能避免这种情况?
示例用法:
在某些方法中:
arrays - 拆箱、(稀疏)矩阵和 haskell 向量库
我想使用 haskell 的向量库有效地操作矩阵(完整或稀疏)。
这是一个矩阵类型
如您所见,矩阵是未装箱向量的向量。现在,我想做一个向量和矩阵之间的点积。通过组合 sum、zip 和 map 来实现相当简单。
但是如果我这样做,因为我正在映射矩阵的行,结果是一个装箱的向量,即使它可以被取消装箱。
如何有效地获得未装箱的矢量?
c# - 拆箱到未知类型
当类型本身未知时,我试图找出支持将整数类型(short/int/long)拆箱为其内在类型的语法。
这是一个完全人为的例子来演示这个概念:
在每种情况下,整数类型都是一致的,所以应该有某种形式的语法说“对象包含一个简单的 X 类型,将其返回为 X(即使我不知道 X 是什么)”。因为对象最终来自同一个来源,所以真的不可能有不匹配(短!=长)。
我为这个人为的例子道歉,这似乎是演示语法的最佳方式。
谢谢。
java - 为什么 Java 中的自动装箱允许我有 3 个可能的布尔值?
参考:http: //java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
“如果你的程序试图自动拆箱 null,它会抛出 NullPointerException。”
如果您尝试将 null 分配给布尔值,javac 会给您一个编译时错误。说得通。不过,将 null 分配给布尔值是可以的。也有道理,我猜。
但是让我们考虑一下在尝试自动拆箱 null 时会得到 NPE 的事实。这意味着您不能在没有空值检查或异常处理的情况下安全地对布尔值执行布尔运算。对整数进行数学运算也是如此。
很长一段时间以来,我都是 java1.5+ 中自动装箱的粉丝,因为我认为它让 java 更接近真正的面向对象。但是,在昨晚遇到这个问题之后,我得说我觉得这很糟糕。当我尝试使用未初始化的原语做一些事情时,编译器给我一个错误是一件好事。如果我丢失了,我不想使用自动装箱。
我想我可能误解了自动装箱的意义,但同时我永远不会接受布尔值应该能够有 3 个值。谁能解释一下?我没有得到什么?
c# - C# 类型转换
我有两个对象。对象 A 和对象 B。
对象 A 是从多个 XSD 文件生成的类的实例。使用 xsd.exe /c 并编译它们。现在我有了我的新对象。
我还有一个 Web 服务,它返回与对象 A 非常相似的东西。所以现在我有一些类似的东西:
我想做的是这个
然而,它并不是真的喜欢这个。说“无法将 MyFramework.foo[] 隐式转换为 WebService.foo[]
关于如何解决这个问题的任何想法?物体很大,它们基本相同。
c# - 在没有转换错误的情况下对 DataRow 中的无类型字段进行拆箱
我的 ASP.Net 应用程序的数据层调用一个存储过程,以在登录时获取少量(一条记录)有关访问者的信息。我传入他们的电话号码和存储过程,使用一个简单的 SELECT,传回 5 个字段,其中第一个是主键,一个 BIGINT。我的数据层获取 DataRow 并尝试用它创建一个数据对象。在数据对象中,表示主键的属性是一个 Int64。看起来像这样:
我发现当我有一个大的主键值(例如 88698)时,一切都很好。但是,当我得到一个小的主键值(如 999)时,我在尝试设置时收到“Specified Cast is Invalid”错误该主键属性。当我尝试在立即窗口中使用它时,我得到了这个:
如果不求助于类型化的数据集,我在这里做错了什么?
.net - 拆箱是否只返回一个指向堆上装箱对象内的值的指针?
在这篇 MSDN 杂志文章中,作者指出(强调我的):
请注意,装箱始终会创建一个新对象并将未装箱值的位复制到该对象。另一方面,拆箱只是返回一个指向装箱对象中数据的指针:不会发生内存复制。但是,通常情况下,您的代码将导致未装箱引用指向的数据无论如何都被复制。
我对我加粗的句子及其后面的句子感到困惑。从我读过的所有其他内容中,包括这个 MSDN page,我以前从未听说过拆箱只会返回一个指向堆上值的指针。我的印象是拆箱会导致您拥有一个包含堆栈上值副本的变量,就像您开始时一样。毕竟,如果我的变量包含“指向堆上值的指针”,那么我没有值类型,我有一个指针。
有人可以解释这是什么意思吗?作者是在破解吗?(文章中至少还有一个明显的错误)。如果这是真的,“您的代码将导致未装箱引用指向的数据无论如何都被复制”的情况是什么?
我刚刚注意到这篇文章已经有将近 10 年的历史了,所以这可能是 .Net 生命早期发生的变化。
c# - 装箱和拆箱,为什么输出都不是“System.Object”?
我得到以下代码:
输出是:
为什么不是他们俩System.Object
?
c# - 通用方法,拆箱可为空的枚举
我做了以下扩展方法......
...我用它来读取数据,如下所示:
但是当我想从装箱值转换为可为空的枚举时,它不起作用。我能想到的最好的就是这个(乱七八糟的 WIP 代码不起作用):
用法:
当前错误是 InvalidCastException,当它尝试将 Int32 强制转换为可为空的枚举时。我猜这没问题,但我不知道我还能怎么做?我试图创建一个可为空的枚举 T 的实例并为其分配一个值,但我对如何做到这一点感到困惑。
任何人有想法或更好的方法来解决这个问题?甚至有可能以通用方式解决这个问题吗?我已经做了很多搜索,但我没有发现任何有用的东西。
optimization - 如果我在 Haskell / GHC 中使用未装箱类型(如 Int#),我应该注意哪些事项?
我正在尝试编写一个解析和执行 Brainfuck 代码的小脚本,以了解 GHC 优化选项,我正在尝试优化代码以便更快一点并了解那里发生了什么。
其中一部分是 BF 代码的内部表示,我为此使用了一种特殊的数据类型。这是源代码,包括进行转换的两个函数:
这个想法是,代码将从一些输入(字符串)中读取,由上述代码进行预解析和简化,然后由其他一些函数执行。(假设输入是有效的)。
为了优化此示例,我尝试通过执行以下操作来拆箱MovePointer
andAdjustValue
构造函数的 Int 参数:
这会将装箱的Int
类型变成未装箱的原始Int#
类型,这是 GHc 的实现细节。在我阅读的过程中,这个选项只在少数情况下有用,所以我想问一下,如果我想进行这种优化,我需要注意哪些事项。我的目标是允许使用 Haskell 的好处执行 BF 代码 - 懒惰(我想归档,代码可能只根据需要保存在内存中)和简单性。