2010-01-16 65 views
2

我使用ADO.NET来沟通一些数据库,并寻找一种方法来避免装箱时将DbParameter.Value属性设置为值类型。避免拳击DbParameter.Value?

有没有办法避免在DbParameter.Value中装箱?

谢谢。

回答

2

我不这么认为。如果您在Reflector中检查SqlParameter类的Value属性,则会看到存储值的内部字段也是类型对象。它没有地方存储整数或浮点数或任何其他方式。

7

为什么你想避免它?拳击的性能成本在整个数据访问层的上下文中可能几乎没有。在线上单独串行参数值可能是拳击成本的100倍。您是否看到归因于拳击的表现问题?

+0

问题不在于拳击本身,问题在于随后需要收集所有这些盒装版本的GC。运行它的过程消耗100%的CPU,所以我想优化所有这些可能导致GC工作时间更长的小事情。 – DxCK 2010-01-16 21:18:42

+0

我不认为100%的CPU使用率是由GC引起的。 GC不会永久运行,它会在需要时运行... – 2010-01-16 22:34:01

2

你不能避免使用装箱值,但你可以避免实际的拳击。或者说,你可以改变拳击发生的方式和时间。只要

object[] boxedIntegers = new object[100]; 
for (int i = 0; i < boxedIntegers.Length; i++) { 
    boxedIntegers[i] = i; 
} 

你不停的阵列,盒装值可以被反复使用,而不会造成任何更多的拳击,他们会:

你可以准备装箱值参数来使用,例如直到阵列失效才收集。

拳击确实会造成任何性能问题值得怀疑,但现在您至少有办法做一些真正的测试。