2

我正在使用 ADO.NET 与一些数据库进行通信,并在将 DbParameter.Value 属性设置为值类型时寻找一种避免装箱的方法。

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

谢谢。

4

3 回答 3

7

为什么要避免它?在整个数据访问层的上下文中,装箱的性能成本可能几乎为零。仅在线路上序列化参数值可能是装箱成本的 100 倍。您是否看到了归因于拳击的性能问题?

于 2010-01-16T20:49:13.057 回答
2

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

于 2010-01-16T20:43:09.183 回答
2

您无法避免使用装箱值,但可以避免实际装箱。或者更确切地说,您可以更改拳击发生的方式和时间。

您可以准备装箱值以在参数中使用,例如:

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

只要保留数组,装箱后的值就可以反复使用而不会造成任何装箱,并且在数组停止使用之前不会收集它们。

拳击是否真的会导致任何性能问题是值得怀疑的,但现在您至少可以进行一些真正的测试。

于 2010-01-16T21:36:26.307 回答