在C#中,doe sit意味着什么:"Box and UnBox"?
这里是MSDN的摘录,我在这里创建了Text.
但这种便利需要付出代价.添加到ArrayList的任何引用或值类型都隐式地向上转换为Object.如果项目是值类型,则在将它们添加到列表时必须将它们装箱,并在检索它们时取消装箱.铸造,装箱和拆箱操作都会降低性能; 在必须迭代大型集合的情况下,装箱和拆箱的效果可能非常显着.
谢谢!
我有一个控制台应用程序,允许用户指定要处理的变量.这些变量有三种形式: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个记录).这是我保留的关于每个变量的一堆其他数据(包括一些布尔值等).因此减少内存会产生巨大影响.
我正在使用一个以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
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中自动装箱的忠实粉丝,因为它节省了许多丑陋的锅炉板代码.但是我发现自动取消装箱在某些可能为null的情况下会引起混淆.有没有办法检测代码库中带有javac警告的自动拆箱位置?任何其他解决方案来检测仅出现拆箱(例如FindBugs或特定于Eclipse的编译器警告)将不胜感激,因为我找不到任何解决方案.
为了澄清我不希望在拳击上生成任何警告 - 仅取消装箱.
下面是一些可能导致混淆NullPointerExceptions的代码的简单示例:
class Test {
private Integer value;
public int getValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud) 我在MSDN杂志的这篇文章中,作者陈述(强调我的):
请注意,装箱始终会创建一个新对象,并将未装箱的值的位复制到该对象.另一方面,取消装箱只返回指向盒装对象内数据的指针:不会发生内存复制.但是,通常情况下,您的代码将导致未装箱引用指向的数据被复制.
我对我加粗的句子和随后的句子感到困惑.从我读过的其他内容,包括这个MSDN页面,我以前从未听说过取消装箱只返回指向堆上值的指针.我的印象是,拆箱会导致你有一个包含堆栈值的副本的变量,就像你开始一样.毕竟,如果我的变量包含"指向堆上的值的指针",那么我没有值类型,我有一个指针.
有人可以解释这意味着什么吗?作者是破解?(文章中至少还有一个明显的错误).如果这是真的,那么"您的代码将导致未装箱的引用指向的数据无论如何都被复制"的情况是什么?
我刚刚注意到这篇文章已经有近10年的历史了,所以也许这在.Net的生命中很早就发生了变化.
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,为什么会有这样的规范?
当我把一个物体和拆箱它我的理解是开箱VALUETYPE像MSDN例子:
int i = 123;
object o = i;
o = 123;
i = (int)o; // unboxing
Run Code Online (Sandbox Code Playgroud)
所以我只是在思考,字符串是否可以取消装箱?我想,不,不可能的,因为没有值类型,可以代表一个字符串.我对吗?
拳击和拆箱是否具有相同的性能?或者说取消装箱更快,让我们说吧?
(如果是,可以简要解释一下主要原因.)
谢谢
我正在尝试转换一个
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原语或枚举类型."
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