.NET如何通过操作优化属性?

时间:2012-01-11 04:19:32

标签: c# .net

为了讨论,我的这个类有属性

public class Intresting
{
   decimal _mQty, _mSpareQty;

   public Qty { get { return _mQty; } set { _mQty = value; } }
   public SpareQty { get { return _mSpareQty; } set { _mSpareQty= value; } }
   public SparePercentage
   { 
     get { return _mQty == 0 ?  0 : _mSpareQty / _mQty; }
     set { _SpareQty = Qty * value; }
   }
}

我担心如果我在自定义GridView中显示1,000,000个有趣的对象,在只读状态下通过属性显示SparePercentage,SparePercentage将反复计算或者是否会进行优化,例如使用第三个_mSpareQtyPercentage在设置Qty和SpareQty时重新计算?

4 个答案:

答案 0 :(得分:7)

我非常怀疑JIT中有哪些内容可以为您执行优化 - 毕竟,每次设置QtySpareQty时需要更多工作,等等每个对象的空间。这不是JIT应该为你做的权衡。当然,你可以自己做 - 只是不要期望C#或JIT编译器为你做这件事。

希望JIT编译器内联您的普通属性 - 从C#3开始可以写成自动实现的属性

public decimal Quantity { get; set; }
public decimal SpareQuantity { get; set; }

(顺便说一下,注意这些更改可以使名称更具可读性。)

答案 1 :(得分:4)

JIT将不会特别优化此属性,因此每次被要求时都会对其进行全面重新评估。但是我怀疑这会在您的应用程序中显示为性能问题的根源。我当然不会自己去处理缓存结果的麻烦,直到个人资料指出我的申请中存在问题为止。

注意:拥有一个具有get的属性也是很奇怪的,它是一个计算并且有一个集合。当在getter中进行计算时,我通常更喜欢完全避免使用setter,而是强制调用者改变与计算相同的基础值

答案 2 :(得分:1)

不,它会在每次调用时执行计算。如果要避免这种情况,则必须实现自己的缓存。

.NET不会优化“优化”属性,而是优化任何其他功能。

答案 3 :(得分:1)

这是建议将多个吸气剂放入支持字段的原因之一。如果要执行操作,则应该在方法中进行。编译器中没有任何内容可以假设代码应该如何执行。

每次调用getter时,样本都会执行公式。 OT,但在线程环境中,我希望我能获得该值的唯一方法是调用方法。