gpt4 book ai didi

c# - 编译器是否以相同的方式解释以下片段?

转载 作者:行者123 更新时间:2023-11-30 19:26:46 24 4
gpt4 key购买 nike

考虑

public List<GroupByDateType> GroupByItems
{
get { return Enum.GetValues(typeof(GroupByDateType)).Cast<GroupByDateType>().ToList(); }
}

private List<GroupByDateType> _GroupByItems;
public List<GroupByDateType> GroupByItems
{
get {return _GroupByItems??(_GroupByItems=Enum.GetValues(typeof(GroupByDateType)).Cast<GroupByDateType>().ToList());}
}

通常我会选择第二个,因为当我看第一个时,我觉得列表是重新生成的,但真的是这样吗,CLR 是否有机会为我创建支持字段?

最佳答案

没有。尽管编译器和 jitter 都可以自由执行所有方式的优化,但通常编译器只执行最明显的优化(特别是删除死代码),而 jitter 往往不会做任何会增加布局或开发人员选择避免的缺点。

Memoisation 通过添加一个字段来改变布局,并以内存为代价优化速度,所以这是你不希望每次都发生的事情(如果你考虑重复调用的次数乘以计算成本值得使用额外的内存)。除其他事项外,决定该平衡涉及此代码之外的因素,例如将创建多少个此类对象(以及因此使用多少内存)。在大量情况下,这不是一个很好的自动更改。

还有一个事实是内存很容易;如果你想要它,你就已经做到了,如果你不想要它,你就不会拥有(事实上,当然不应该每次都这样做,只有当它有真正的优势时)。

相反,将 null 作为可能结果覆盖的内存有点棘手,而必须是线程安全的内存又更棘手(有几种不同的方法适用于不同的并发情况,所有这些本身都很容易,但选择哪个经常不使用)。将线程安全的方法(包括属性 getter)转变为线程安全的方法(或至少改变对象在并发调用时的行为)的“优化”是完全不合适的。

Memoisation 有时也会有细微的语义差异,例如您的示例;如果调用代码更改列表,则行为会有所不同。这可能是至关重要的(该列表由其他代码检查此类更改)或错误(下一个调用者获得不正确的更改列表)或无关紧要(它仅供内部使用,您不会在任何地方更改它,因此您重新削减维护成本)。并不是所有的内存都有这个问题(例如,可以返回一个只读列表),但这确实意味着它不能自动完成。

关于c# - 编译器是否以相同的方式解释以下片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com