为了讨论,我的这个类有属性
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时重新计算?
答案 0 :(得分:7)
我非常怀疑JIT中有哪些内容可以为您执行优化 - 毕竟,每次设置Qty
和SpareQty
时需要更多工作,等等每个对象的空间。这不是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,但在线程环境中,我希望我能获得该值的唯一方法是调用方法。