拳击记忆问题

And*_*ndy 3 .net c# boxing properties

private double _value;


public object Value
{
    get
   {
         return _value;
   }

}
Run Code Online (Sandbox Code Playgroud)

嗨,大家好只是进行代码审查,并在我们的代码库中注意到了 它不是一个错字,但我关注的是调用getter时涉及的拳击,并且假设这个代码是一个生成数百次的类型,并且频繁调用getter我可以看到内存问题.

我的担忧是否与记忆有关?我的意思是,由于拳击,我们加倍了吗?

Cod*_*ray 6

是的,您展示的代码片段确实会导致拳击.你迫使运行时转换doubleobject.如果您想向自己或同事证明,请查看已编译的IL以获取告知boxunbox说明.

然而,尽管你在尽可能避免拳击时是正确的,但实际的性能损失并不总是像宣传那样重要.在对代码库进行重大更改之前,请花一些时间进行性能分析,以确保您花费时间的代码确实是性能瓶颈.

鉴于上面的具体示例,为什么您需要首先返回类型object,这一点并不是特别清楚.由于您只是返回私有字段的值,因此您只需将属性更改为返回类型即可double.

或者,您可以将属性转换为通用方法.(属性不能是通用的,但是方法可以,如果你在getter中进行计算密集的工作,它可能应该是一种方法.)泛型减轻了拳击的问题,但仍然允许你很大程度的返回什么类型的灵活性(类似于返回类型object).