循环中的实例化:详细程度与性能

时间:2010-07-13 06:11:42

标签: c# performance

因此,在下面的代码中,我非常喜欢方案一的详细内容,但我想知道与方案二相比,这会带来多大的性能影响。循环中的实例化是一个大问题吗?

语法上的好处(我喜欢,有些人可能甚至不同意它是冗长或最佳的)是否值得称之为性能?您可以假设集合仍然相当小(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);
}

我很乐意听到你们这些人的想法,因为我经常看到这一点。

3 个答案:

答案 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)

保持您最满意的格式 - 如果它们的效果都适合您的应用程序。如果遇到性能问题,请稍后进行优化。