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

Bra*_*ler 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*sen 8

我会稍微改变一下这个问题.如果发生的事情在new ProductCategoryModel.ProductCategoryModelConverter(currentContext)循环期间没有改变,我认为没有理由将它包含在循环中.如果它不是循环的一部分,它不应该在那里imo.

如果你只是因为它看起来更好而包含它,你就会强迫读者弄清楚它是否有所作为.


Jon*_*eet 6

像Brian一样,如果你没有真正改变它,我认为没有理由创建一个新实例 - 我假设这Convert不会改变原始对象?

我建议使用LINQ完全避免循环(就你自己的代码而言):

var modelConverter = new ProductCategoryModelConverter(currentContext);
var models = productCategories.Select(x => modelConverter.Convert(x))
                              .ToList();
Run Code Online (Sandbox Code Playgroud)

在性能方面,它取决于ProductCategoryModelConverter构造函数必须做什么.就开销而言,创建一个新对象非常便宜.当然,这不是免费的 - 但我不认为这会在大多数情况下造成瓶颈.但是,我会说在循环中实例化它会向读者暗示它是必要的; 有一些理由使用单个对象.一个转换器肯定听起来就像它的工作一样会保持不变......所以我会被实例化的循环版本所困惑.

  • @Brad:LINQ对很多东西都很棒.虽然我可以理解LINQ to SQL等的谨慎(它可能更难预测什么会起作用),但LINQ to Objects现在对我来说是个明智的选择.没有它,我几乎不记得C#. (2认同)