因此,在下面的代码中,我非常喜欢方案一的详细内容,但我想知道与方案二相比,这会带来多大的性能影响。循环中的实例化是一个大问题吗?
语法上的好处(我喜欢,有些人可能甚至不同意它是冗长或最佳的)是否值得称之为性能?您可以假设集合仍然相当小(N <几百)。
// First scenario
var productCategoryModels = new List<ProductCategoryModel>();
foreach (var productCategory in productCategories)
{
var model = new ProductCategoryModel.ProductCategoryModelConverter(currentContext).Convert(productCategory);
productCategoryModels.Add(model);
}
// Second scenario
var productCategoryModels = new List<ProductCategoryModel>();
var modelConvert = new ProductCategoryModel.ProductCategoryModelConverter(currentContext);
foreach (var productCategory in productCategories)
{
var model = modelConvert.Convert(productCategory);
productCategoryModels.Add(model);
}
我很乐意听到你们这些人的想法,因为我经常看到这一点。
答案 0 :(得分:8)
我会稍微改变一下这个问题。如果new ProductCategoryModel.ProductCategoryModelConverter(currentContext)
中发生的任何事情在循环期间没有改变,我认为没有理由将它包含在循环中。如果它不是循环的一部分,它不应该在那里imo。
如果你只是因为它看起来更好而包含它,你就会强迫读者弄清楚它是否有所作为。
答案 1 :(得分:6)
和Brian一样,如果你没有真正改变它,我认为没有理由创建一个新实例 - 我假设Convert
没有改变原始对象?
我建议使用LINQ完全避免循环(就你自己的代码而言):
var modelConverter = new ProductCategoryModelConverter(currentContext);
var models = productCategories.Select(x => modelConverter.Convert(x))
.ToList();
在性能方面,它取决于ProductCategoryModelConverter
的构造函数必须做什么。就开销而言,创建一个新对象非常便宜。当然,这不是免费的 - 但在大多数情况下,我不希望这会导致瓶颈。但是,我会说在循环中实例化它会暗示给读者,这是必要的;有一些原因不只使用一个对象。一个转换器当然听起来就像它的工作一样会保持不变......所以我会对实例化的循环版本感到困惑。
答案 2 :(得分:1)
保持您最满意的格式 - 如果它们的效果都适合您的应用程序。如果遇到性能问题,请稍后进行优化。