问题标签 [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 投票
10 回答
34005 浏览

c# - “as”和可空类型的性能惊喜

我只是在深度修改处理可空类型的 C# 的第 4 章,并且我正在添加一个关于使用“as”运算符的部分,它允许您编写:

我认为这真的很简洁,并且它可以提高 C# 1 等效项的性能,使用 "is" 后跟一个强制转换 - 毕竟,这样我们只需要请求一次动态类型检查,然后是一个简单的值检查.

然而,情况似乎并非如此。我在下面包含了一个示例测试应用程序,它基本上将对象数组中的所有整数相加 - 但该数组包含大量空引用和字符串引用以及装箱整数。该基准测试您必须在 C# 1 中使用的代码、使用“as”运算符的代码,以及仅用于启动 LINQ 解决方案的代码。令我惊讶的是,在这种情况下,C# 1 代码的速度要快 20 倍——甚至 LINQ 代码(考虑到所涉及的迭代器,我预计它会更慢)胜过“as”代码。

可空类型的 .NET 实现isinst真的很慢吗?unbox.any是导致问题的附加因素吗?对此还有其他解释吗?目前感觉我将不得不包含一个警告,不要在性能敏感的情况下使用它......

结果:

演员:10000000:121
作为:10000000:2211
LINQ:10000000:2143

代码:

0 投票
2 回答
885 浏览

c# - C# 编译器 + 带有装箱的通用代码 + 约束

让我们检查为以下通用方法生成的 MSIL 代码:

看:

但是对于上面的通用代码,更有效的 IL 表示应该是:

从约束中可知,该值被装箱到引用类型中。Unbox.anyopcode 是完全多余的,因为在boxopcode 之后,IL 堆栈中的值已经是对 的有效引用!!U,无需任何拆箱即可使用。

为什么 C# 3.0 编译器不使用约束元数据来生成更高效的通用代码?Unbox.any 的开销很小(只是慢了 4 到 5 倍),但为什么不在这种情况下发出更好的代码呢?

0 投票
2 回答
1142 浏览

c# - 如何防止拆箱 - 读取任意 sql 行时装箱内存开销

我正在编写一个类来表示 SQL 查询中的一行。我希望通过类的 indexer 属性访问字段数据。如果我将数据加载到内部对象列表中,这很简单。我已经尝试过这个并且对原始人的拳击不满意。拳击增加了 20% 的内存需求。我想将原语存储为类中的原语。DataTable 类通过为从 IDataReader 返回的架构中的每一列创建数组来存储基元。我以这种方式实现了一个类,但我更喜欢将数据与行对象一起存储,而不是存储在行内部引用的列中。

有什么想法可以做到这一点吗?

0 投票
2 回答
161 浏览

c - 如何制作一个未装箱的浮点数组,我可以得到一个 Ptr

我正在尝试使用 HopenGL 做一些工作,我需要一个指向浮点数组的 Ptr。从我读过的内容来看, uarray 和 storableArray 似乎是要走的路,以某种方式结合起来。

0 投票
8 回答
277 浏览

c# - 当使用泛型在集合中使用对象时,.Net 会进行类型转换吗?

.net CLR 是否将对象类型转换为集合声明中提到的对象?如果我声明一个

.net 在添加和检索时会对该对象进行类型转换??????

好吧,我认为每个人都没有清楚地理解这个问题。让我详细说明一下。在 java 中有泛型,但是如果你反编译代码你会注意到,编译器在任何使用 Collection 对象的地方放置一个类型转换。例如:列表 listOfStrings;listOfStrings.add(""); 字符串值 = listOfStrings.get(1); 反编译类文件后我们看到这个List listOfStrings;listOfStrings.add(""); 字符串值 = (String)listOfStrings.get(1); 在这里,编译器已经对字符串进行了类型转换。

现在我的问题是.Net中是否相同?

0 投票
5 回答
1062 浏览

java - 内部编译器错误 ArrayIndexOutOfBoundsException: -1 ... generateUnboxingConversion

尝试编译时遇到了一些奇怪的异常:

这是一个有效的检查(拆箱-隐式强制转换-拆箱)吗?

0 投票
2 回答
1429 浏览

c# - 拆箱数据库值的正确方法

我正在使用较旧的 Oracle 数据库,并且我觉得可能有更好的方法来取消我从数据库中检索的值的装箱。

目前,我有一个充满不同类型特定方法的静态类:

..等等不同类型,但我觉得应该有更好的方法?如果我想拆箱一个值,我会做一些事情......

p>

我考虑过使用泛型类来处理所有不同的类型,但我真的想不出最好的方法。

有任何想法吗?

0 投票
4 回答
3549 浏览

java - Java 自动拆箱 - 是否有编译器警告?

我是 Java 自动装箱的忠实粉丝,因为它节省了很多丑陋的样板代码。但是,我发现在 Number 对象可能为空的某些情况下,自动拆箱会让人感到困惑。有什么方法可以检测代码库中发生自动拆箱的位置并带有 javac 警告?任何其他仅检测拆箱事件的解决方案(例如 FindBugs 或 Eclipse 特定的编译器警告)将不胜感激,因为我找不到任何解决方案。

为了澄清,我不希望在装箱时产生任何警告 - 只拆箱。

下面是一些可能导致混淆 NullPointerExceptions 的代码的简单示例:

0 投票
5 回答
2732 浏览

c# - 匿名类型

我有一个Dictionary(TKey, TValue)

后来我在该数组列表中添加了一个像这样的匿名类型

现在我怎样才能解开那个 var 并访问这些属性?

0 投票
3 回答
2778 浏览

vb.net - 将 .GetValueOrDefault(0) 和 If(variable, 0) 与可空类型一起使用有什么区别吗?

以下两种计算 c 的方法之间有什么区别……特别是装箱/拆箱问题?