2010-07-13 68 views
1

所以在下面的代码中,我真的很喜欢场景一的详细程度,但是我想知道与场景二相比,这会带来多大的性能。在循环中实例化是一件大事?在循环中的实例化:详细性与性能

语法上的好处(我喜欢,有些人可能甚至不认同它是冗长或最优的)值得一提的是性能?你可以假设收藏仍然相当小(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

您应该优化清晰度而不是冗长。 – 2010-07-13 06:27:56

回答

8

我会以不同的方式处理这些问题。如果new ProductCategoryModel.ProductCategoryModelConverter(currentContext)中发生的任何事情在循环过程中不发生变化,我认为没有理由将其包含在循环中。如果它不是循环的一部分,它不应该在那里。

如果仅仅因为它看起来更好而包含它,那么你就会强迫读者判断它是否有所作为。

+1

有趣,所以也许它不像我想象的那么冗长。最终对象不改变状态的概念我没有考虑过。 – 2010-07-13 06:19:53

+0

@Brad Heller:我不知道它是否确实如此,但是由于您将两者等同起来,我假设您不需要它。 – 2010-07-13 06:22:05

1

保留您最喜欢的格式 - 如果它们对您的应用程序表现不错。如果遇到性能问题,稍后优化。

6

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

我推荐使用LINQ避免环路完全虽然(在你自己的代码方面):

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

在性能方面,这将取决于什么ProductCategoryModelConverter的构造不得不这样做。就开销而言,创建一个新对象相当便宜。当然,这不是免费的 - 但我不希望这会在大多数情况下造成瓶颈。但是,我会说在一个循环中实例化它将意味着给读者,它是必要的;有一些原因而不是只能使用一个对象。 A转换器肯定是听起来像某些东西会保持不变,因为它的工作......所以我会被实例化在一个循环版本迷惑。

+0

哦,使用链接真的是一个好主意!由于某种原因,我已经避免了很长时间的linq,这对于我的工作流程来说是一个低挂的成果! – 2010-07-13 06:22:04

+2

@Brad:LINQ对很多事情来说都很棒。虽然我可以理解LINQ to SQL等的谨慎(在哪里可能难以预测什么会起作用),但对于我来说,LINQ to Objects对于我来说这些日子来说是不容易的。没有它我几乎可以记住C#。 – 2010-07-13 06:23:11

+0

我了解LINQ,我只是害怕它会让我的代码不易维护。这种类型的LINQ语法非常好,像''(从产品中的p选择converter.Convert(p))一样,SQL-ish语法越多。ToList();'使我变得疯狂。 – 2010-07-13 06:24:56