2014-01-13 2 views
-1

나는 간단히 말해서 당신에게 initalizer 방법과 직접적인 방법을 추가하는 방법 사이에 차이점이 있는지 묻고 싶다.초기화 프로그램이있는 목록에 항목 추가 또는 정의 된 변수 추가?

var list = new List<Item>(); 
for (int i = 0; i < 100000; i++) 
{ 
    list.Add(new Item() { ID = i, Title = "Item" }); 
} 

그리고이 코드 : 다음은이 코드 사이

var list = new List<Item>(); 
for (int i = 0; i < 100000; i++) 
{ 
    var item = new Item() { ID = i, Title = "Item" }; 
    list.Add(item); 
} 

는 어떤 차이가 있습니까? 프로그램을 컴파일 할 때 동일한 코드입니까? 만약 1에서 1 백만까지 루프를 만들면 나는 여전히 같은 결과를 얻습니다 (다른 효과는 무시합니다)?

+2

'1에서 1 백만까지 루프를 만들면 나는 여전히 같은 결과를 얻는다. (다른 효과는 무시한다)? '- 시도해보십시오. –

+0

코드를 테스트하려면 다른 모든 프로세스를 중지해야합니다. 우리의 과정 만 있어야합니다. 어쩌면 누군가 알고있을 것입니다 – ArgeKumandan

+0

그 코드를 테스트하려면 여기에 올려 놓은 것을 가져 와서 'Stopwatch'에 넣어 런타임을 결정하십시오. –

답변

0

나는 exe를 컴파일하고 반사경에 컴파일 된 코드를 보았다. 다음은 사전 컴파일 된 소스에서 내 코드입니다 :

 list.Add(new Item() { ID = 2, Title = "Item" }); 
     Item yeni = new Item() { ID = 4, Title = "Item" }; 
     list.Add(yeni); 

그리고 여기에 컴파일 된 코드 :

private static void Main(string[] args) 
{ 
     List<Item> list = new List<Item>(); 
     Item <>g__initLocal0 = new Item(); 
     <>g__initLocal0.ID = 2; 
     <>g__initLocal0.Title = "Item"; 
     list.Add(<>g__initLocal0); 
     Item <>g__initLocal1 = new Item(); 
     <>g__initLocal1.ID = 4; 
     <>g__initLocal1.Title = "Item"; 
     Item yeni = <>g__initLocal1; 
     list.Add(yeni); 
} 

난 그냥 실현 컴파일러는 UR 매개 변수를 사용하여 목록에 추가합니다보다 새로운 veriable을 정의합니다. 모두들 고맙습니다.

1

차이는 없습니다. IL 코드를 확인하여 어쨌든 목록에 추가하기 전에 new Item()을 저장해야하는지 확인하십시오. 그러나 첫 번째 코드 스 니펫은 코드 관점에서 깔끔하게 보입니다. 차이가 없습니다

1

(컴파일러 최적화가에있는 경우 두 경우 모두 에 idential 효율적인 코드를 생성 할 똑똑 입니다),하지만 당신은 Capasity 목록 을 설정하여 조금 더 나은 코드를 만들 수 있습니다

int size = 100000; 

var list = new List<Item>(size); // <- setting capacity 

for (int i = 0; i < size; ++i) 
    list.Add(new Item() { ID = i, Title = "Item" }); 
0

두 번째 예제에서 새로 인스턴스화 된 항목을 변수에 저장하기 만하면됩니다. 첫 번째 예제에서는 인스턴스를 만들고 같은 줄에 추가하는 반면 목록에 추가하기 전에는 간단히 저장합니다. 아이템을 저장하는 변수는 대괄호를 벗어나면 소멸됩니다.

항목에 무엇이 있는지 디버깅하지 않는 한, 첫 번째 코드 세트가 더 좋을 것이라고 생각합니다.