gpt4 book ai didi

c# - 冗余代码是在编译器中管理还是每次都执行?

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:00 25 4
gpt4 key购买 nike

我正在优化一个旧代码(并将一些代码转移到一个较新的项目),我偶然发现了这段代码

if (typeList.FirstOrDefault()?.typeId == Constants.OpenTextTypeId)
generatedTextStrBuilder.Append("Empty");
else if (typeList.FirstOrDefault()?.typeId == Constants.OutSideId)
generatedTextStrBuilder.Append($" [{ typeList.First().typeName }] ");
else if (Constants.typeListOfReview.Contains(typeList.FirstOrDefault()?.typeId))
generatedTextStrBuilder.Append($"*[{ typeList.FirstOrDefault()?.typeName }]*");
else
generatedTextStrBuilder.Append($"_[{ typeList.FirstOrDefault()?.typeName }]_");

如代码所示typeList.FirstOrDefault()?.typeId 每个条件写一次

问题是是编译器管理这种类型的冗余还是每次都执行它?

如果编译器这样做,它是否只在这个方法中管理它?

最佳答案

编译器每次都必须发出调用 FirstOrDefault() 的代码。毕竟以下任何一项都可能为真:

  • typeList 引用的对象可能会在 ifelse if 之间改变,例如在多线程应用程序中。
  • FirstOrDefault 的输出可能取决于某些外部状态,而不仅仅是输入,因此多次调用可能会返回不同的东西。
  • FirstOrDefault 可能会产生副作用。

如果您考虑一下,编译器可以删除“冗余”代码的唯一方法是如果

  • typeList 是不可变对象(immutable对象)的不可变集合,每次都以相同的顺序返回项目
  • FirstOrDefault 是一个纯函数,即它只依赖于输入并且没有副作用,并且
  • typeId 如果基础对象没有改变,则返回相同的值。

(这个条件列表很可能不完整,它可能比这个简单列表所暗示的要棘手得多)

关于c# - 冗余代码是在编译器中管理还是每次都执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57075351/

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