2010-07-13 63 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