代码之家  ›  专栏  ›  技术社区  ›  Brad Heller

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

  •  1
  • Brad Heller  · 技术社区  · 16 年前

    所以在下面的代码中,我非常喜欢场景一的冗长,但是我想知道与场景二相比,这会对性能造成多大的影响。循环中的实例化是一件大事吗?

    语法上的好处(我喜欢,有些人甚至可能不同意它是冗长的或最佳的)值得说性能上的打击吗?您可以假设集合仍然相当小(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 回复  |  直到 16 年前
        1
  •  8
  •   Brian Rasmussen    16 年前

    我会用不同的方式来回答这个问题。如果发生什么事 new ProductCategoryModel.ProductCategoryModelConverter(currentContext) 在循环过程中没有变化,我认为没有理由将其包含在循环中。如果它不是循环的一部分,它就不应该在那里。

    如果你仅仅因为它看起来更好就把它包括进来,那么你就强迫读者去弄清楚它是否起到了作用。

        2
  •  6
  •   Jon Skeet    16 年前

    像Brian一样,如果你不改变它,我认为没有理由创建一个新的实例-我是这样假设的 Convert

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

    var modelConverter = new ProductCategoryModelConverter(currentContext);
    var models = productCategories.Select(x => modelConverter.Convert(x))
                                  .ToList();
    

    就性能而言,这将取决于 ProductCategoryModelConverter 的构造函数必须这样做。就开销而言,仅仅创建一个新对象是相当便宜的。当然,这不是免费的,但我不认为这会在大多数情况下造成瓶颈。然而,我认为在循环中实例化它 意味着 告诉读者这是必要的;是有原因的 只用一个物体。当然是转换器 就像它工作时保持不变的东西。。。所以我对循环中的实例化版本感到困惑。

        3
  •  1
  •   Will A    16 年前