标签: unboxing

Box和UnBox是什么意思?

可能重复:
为什么我们需要在C#中装箱和拆箱?
什么是拳击和拆箱以及有什么权衡取舍?

在C#中,doe sit意味着什么:"Box and UnBox"?

这里是MSDN的摘录,我在这里创建了Text.

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

谢谢!

.net c# boxing unboxing

11
推荐指数
1
解决办法
1万
查看次数

在C#/ .NEt动态类型占用的空间比对象少吗?

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

public class UnitResponse
{
    public object Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

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

c# memory boxing unboxing dynamic

10
推荐指数
2
解决办法
2461
查看次数

通过传入单个元素原始数组避免装箱

我正在使用一个以Object类型为输入的接口.这对我来说是不幸的,因为我有时需要通过界面传递原始数据.这当然迫使我陷入困境.

分析表明该区域是代码中的热点.因此,我正在探索使这一领域更快的替代方案.

我今天想到的一个想法是预先分配一个静态原始数组,并将原始值存储在其中,然后传递数组(然后在接口的实现中,抓住数组中的双精度数.

我已经编写了一些代码来测试这个.对于相当高的值(1000万),我发现数组方法明显更快.当我增加测试的迭代次数时,两者会聚.

我想知道是否有人曾经考虑过这种方法,如果有任何关于如何对此进行基准测试的建议.

示例代码:

Double data = Double.valueOf(VALUE);
inst.interface(data);
//inside interface(Object object)...
Double data = (Double) object;
double d = data.value();
Run Code Online (Sandbox Code Playgroud)

VS ...

doublearray[0] = VALUE;
inst.interface(data);
//inside interface(Object object)...
double[] data = (double[]) object;
double d = data[0];
Run Code Online (Sandbox Code Playgroud)

谢谢!RB

java autoboxing boxing unboxing interface

10
推荐指数
1
解决办法
597
查看次数

自动装箱拆箱操作员(!=)和(==)区别

public class T1 {    

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Integer i1 = 1000;
        Integer i2 = 1000;
        if(i1 != i2) System.out.println("different objects");
        if(i1.equals(i2)) System.out.println("meaningfully equal");    

    }

}
Run Code Online (Sandbox Code Playgroud)

对此的O/P是:

不同的对象
有意义地相等

在哪里

public class T2 {    

    public static void main(String[] args) {            

        Integer i3 = 10;
        Integer i4 = 10;
        if(i3!=i4)System.out.println("Crap dude!!");
        if(i3 == i4) System.out.println("same object");

        if(i3.equals(i4)) System.out.println("meaningfully equal");    
    }

}
Run Code Online (Sandbox Code Playgroud)

产生以下O/P:

同样的对象
有意义地相等

我不明白为什么在课堂T2 if(i3!=i4)上没有被触发我是在推荐SCJP 1.6但是无法理解.
请帮我.

java autoboxing unboxing

10
推荐指数
1
解决办法
677
查看次数

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

我是Java中自动装箱的忠实粉丝,因为它节省了许多丑陋的锅炉板代码.但是我发现自动取消装箱在某些可能为null的情况下会引起混淆.有没有办法检测代码库中带有javac警告的自动拆箱位置?任何其他解决方案来检测仅出现拆箱(例如FindBugs或特定于Eclipse的编译器警告)将不胜感激,因为我找不到任何解决方案.

为了澄清我不希望在拳击上生成任何警告 - 仅取消装箱.

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

class Test {
    private Integer value;

    public int getValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

java autoboxing boxing unboxing

9
推荐指数
2
解决办法
3334
查看次数

取消装箱只是返回指向堆上盒装对象中的值的指针吗?

在MSDN杂志的这篇文章中,作者陈述(强调我的):

请注意,装箱始终会创建一个新对象,并将未装箱的值的位复制到该对象.另一方面,取消装箱只返回指向盒装对象内数据的指针:不会发生内存复制.但是,通常情况下,您的代码将导致未装箱引用指向的数据被复制.

我对我加粗的句子和随后的句子感到困惑.从我读过的其他内容,包括这个MSDN页面,我以前从未听说过取消装箱只返回指向堆上值的指针.我的印象是,拆箱会导致你有一个包含堆栈值的副本的变量,就像你开始一样.毕竟,如果我的变量包含"指向堆上的值的指针",那么我没有值类型,我有一个指针.

有人可以解释这意味着什么吗?作者是破解?(文章中至少还有一个明显的错误).如果这是真的,那么"您的代码将导致未装箱的引用指向的数据无论如何都被复制"的情况是什么?

我刚刚注意到这篇文章已经有近10年的历史了,所以也许这在.Net的生命中很早就发生了变化.

.net boxing unboxing

9
推荐指数
2
解决办法
550
查看次数

整数包装类和==运算符 - 指定的行为在哪里?

Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);//true

integer1 = 128;
integer2 = 128;
System.out.println(integer1 == integer2);//false
Run Code Online (Sandbox Code Playgroud)

我发现它返回==(如果是)在范围之内-128 - 127,为什么会有这样的规范?

java comparison boxing unboxing

9
推荐指数
1
解决办法
7216
查看次数

我可以拆箱吗?

当我把一个物体和拆箱它我的理解是开箱VALUETYPE像MSDN例子:

int i = 123;
object o = i;  
o = 123;
i = (int)o;  // unboxing
Run Code Online (Sandbox Code Playgroud)

所以我只是在思考,字符串是否可以取消装箱?我想,不,不可能的,因为没有值类型,可以代表一个字符串.我对吗?

.net c# boxing unboxing

9
推荐指数
1
解决办法
458
查看次数

拳击和拆箱是否具有相同的性能?

拳击和拆箱是否具有相同的性能?或者说取消装箱更快,让我们说吧?

(如果是,可以简要解释一下主要原因.)

谢谢

.net heap clr boxing unboxing

8
推荐指数
1
解决办法
2097
查看次数

从ac#表达式中删除不需要的拳击转换

我正在尝试转换一个

Expression<Func<T,object>>
Run Code Online (Sandbox Code Playgroud)

到了

Expression<Func<T,bool>> 
Run Code Online (Sandbox Code Playgroud)

目前,手表向我显示我的表情

Expression<Func<T,object>> myExpression = model=>Convert(model.IsAnAirplane)
Run Code Online (Sandbox Code Playgroud)

我想简化这个

Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane
Run Code Online (Sandbox Code Playgroud)

目前我只成功添加转换,导致:

Expression<Func<T,bool>> myExpression = model=>Convert(Convert(model.IsAnAirplane))
Run Code Online (Sandbox Code Playgroud)

但由于底层类型是一个bool,我应该能够完全划伤转换器,对吧?我熟悉表达式访问者等,但仍然无法弄清楚如何删除转换.

编辑:这个问题的接受答案表达式<Func <T,对象>>到表达式<Func <T,TResult >>(可能是重复的)的通用拆箱对我来说不起作用...作为表达式由EF翻译,你可以看到它转换(转换())而不是只删除第一个转换...,这导致"无法转换类型'System.Boolean'来键入'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型."

c# lambda boxing unboxing expression

8
推荐指数
1
解决办法
720
查看次数

标签 统计

unboxing ×10

boxing ×9

.net ×4

c# ×4

java ×4

autoboxing ×3

clr ×1

comparison ×1

dynamic ×1

expression ×1

heap ×1

interface ×1

lambda ×1

memory ×1