标签: unboxing

用 == 比较 Integer 和 int

List<Integer> test = List.of(955, 955);
if (test.get(1) == test.get(0))
...
Run Code Online (Sandbox Code Playgroud)

以上条件导致 false

List<Integer> test = List.of(955, 955);
int a = test.get(1);
int b = test.get(0);
if (a == b)
...
Run Code Online (Sandbox Code Playgroud)

上述条件返回true

为什么会这样?片段之间有什么区别?

java autoboxing unboxing integer wrapper

4
推荐指数
1
解决办法
117
查看次数

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

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

public static U BoxValue<T, U>(T value)
  where T : struct, U
  where U : class
{
  return value;
}
Run Code Online (Sandbox Code Playgroud)

看:

.method public hidebysig static !!U  BoxValue<valuetype .ctor
 ([mscorlib]System.ValueType, !!U) T,class U>(!!T 'value') cil managed
{
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  box        !!T
  IL_0006:  unbox.any  !!U
  IL_000b:  ret
}
Run Code Online (Sandbox Code Playgroud)

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

  IL_0000:  ldarg.0
  IL_0001:  box        !!T
  IL_0006:  ret
Run Code Online (Sandbox Code Playgroud)

从约束中可知,该值被加框为引用类型.Unbox.any操作码是完全冗余的,因为在box操作码之后,IL栈的值已经是有效的引用!!U,可以在没有任何拆箱的情况下使用.

为什么C#3.0编译器不使用约束元数据来发出更高效的通用代码?Unbox.any提供了一个小的开销(只比4x-5x慢),但为什么不在这种情况下发出更好的代码呢?

c# generics boxing unboxing cil

3
推荐指数
1
解决办法
810
查看次数

正确的方法来取消装箱数据库值

我有一个较旧的Oracle数据库的工作,我觉得有可能是一个更好的方式去了解我拆箱从数据库中检索值.

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

public static int? Int(object o)
{
    try
    {
        return (int?)Convert.ToInt32(o);
    }
    catch (Exception)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

..等等,对于不同的类型,但我觉得应该有更好的方法?如果我想取消装箱值,我会做一些......

int i;
i = nvl.Int(dataRow["column"]); //In this instance, "column" is of a numeric database type
Run Code Online (Sandbox Code Playgroud)

我想过使用泛型类来处理所有不同的类型,但我无法找到最佳方法.

有任何想法吗?

c# database unboxing

3
推荐指数
1
解决办法
1411
查看次数

扩展 System.Object 时如何避免装箱/拆箱?

我正在研究一种仅适用于引用类型的扩展方法。然而,我认为目前正在对值进行装箱和拆箱。我怎样才能避免这种情况?

namespace System
{
    public static class SystemExtensions
    {
        public static TResult GetOrDefaultIfNull<T, TResult>(this T obj, Func<T, TResult> getValue, TResult defaultValue)
        {
            if (obj == null)
                return defaultValue;
            return getValue(obj);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

public class Foo
{
    public int Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在某种方法中:

Foo aFooObject = new Foo { Bar = 1 };
Foo nullReference = null;

Console.WriteLine(aFooObject.GetOrDefaultIfNull((o) => o.Bar, 0));  // results: 1
Console.WriteLine(nullReference.GetOrDefaultIfNull((o) => o.Bar, 0));  // results: 0
Run Code Online (Sandbox Code Playgroud)

.net c# extension-methods boxing unboxing

3
推荐指数
1
解决办法
1225
查看次数

当声明为类的一部分时,ValueType是否会被装箱?

考虑这个课程:

public class Foo
{
    public Int32 MyField;
}
Run Code Online (Sandbox Code Playgroud)

我猜"MyField"成员不在线程堆栈上,因为它可以被多个线程访问,它必须肯定在托管堆中,但这是否意味着每次使用时它都被装箱并取消装箱?

提前致谢

.net c# boxing unboxing memory-management

3
推荐指数
1
解决办法
158
查看次数

拆箱问题

我有一个扩展LinkedList类的类.这是代码的摘录:

class SortedList<Integer> extends LinkedList<Integer> {
      int intMethod(Integer integerObject){
          return integerObject;
      }
}
Run Code Online (Sandbox Code Playgroud)

预计会返回自动取消装箱的int值.但由于某种原因,编译器抛出一个错误,指出类型不兼容,并且所需类型为int,找到的类型为Integer.这在一个完全不同的班级工作!是什么赋予了?:(

java autoboxing unboxing

3
推荐指数
1
解决办法
653
查看次数

是否有类似f#的通用unbox功能?

我试图使用对象处理程序,我有这个工作正常,把东西放在内存中.但当我再次查看对象时,我会回复:

object(object[,]) 
Run Code Online (Sandbox Code Playgroud)

要么

object(double[,]) 
Run Code Online (Sandbox Code Playgroud)

如何在c#中取消装箱?

object(double[,]) boxedobj = ....
double[,] unboxedobj = unbox(boxedobj);
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想以通用方式执行此操作,以便无论tybe是double []还是double [,]或object [,]等都无关紧要

c# f# unboxing

3
推荐指数
1
解决办法
518
查看次数

c#通过对象取消装箱

我可以投byteint没有任何问题.

byte a = 2;
int b = a;      // => unboxing, boxing or conversion?
Run Code Online (Sandbox Code Playgroud)

当我byte先施展object,然后int我得到一个InvalidCastException.

byte a = 2;
object b = a;    // => boxing?
int c = (int) b; // => unboxing fails?
Run Code Online (Sandbox Code Playgroud)

但我可以通过使用来解决这个问题Convert.ToInt32.

byte a = 2;
object b = a;                // => boxing?
int c = Convert.ToInt32(b);  // => what happens here?
Run Code Online (Sandbox Code Playgroud)
  • 为什么我InvalidCastException在第二个例子中得到一个?
  • 这是什么Convert.ToInt32背景?
  • 难道我的标签boxing, …

c# boxing unboxing casting

3
推荐指数
1
解决办法
248
查看次数

'map.get(key)' 的拆箱可能会产生 'NullPointerException'

这段代码

public static int getValue(int key) {
    return map.get(key);
}

private static Map<Integer, Integer> map;
static {
    map = new HashMap<>();
    map.put(1, 1);
    map.put(2, 2);
}
Run Code Online (Sandbox Code Playgroud)

产生Lint警告

'map.get(key)' 的拆箱可能会产生 'NullPointerException'

可以通过检查以下内容来修复此警告null

public static int getValue(int key) {
    Integer n = map.get(key);
    return n != null ? n : -42;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

java unboxing

3
推荐指数
1
解决办法
1800
查看次数

Java 对方法返回值的拆箱

给出以下方法:

Long getLong() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我调用它并将返回值分配给这样的变量:

long abc = getLong();
Run Code Online (Sandbox Code Playgroud)

Long生成一个对象然后转换为 long 还是 Java 足够聪明以避免生成中间Long对象?或者它实际上可能取决于getLong()?

我问这个的原因是包装对象的大小通常比相应的原始类型大小大得多。如果我必须多次调用此方法,并且每次都需要为Long对象分配内存,则程序最终将消耗比实际需要更多的内存,从而触发更多的 GC 周期。

此外,我如何验证执行时发生的确切步骤long abc = getLong()(基本上也在寻找有关如何获得上述问题的答案的指导)?

java unboxing

3
推荐指数
1
解决办法
68
查看次数