2011-01-25 2 views
0

가능한 중복 :
Declaring a variable inside or outside an foreach loop: which is faster/better?declare variable in/out에 어떤 차이가 있습니까?

안녕 모두,

어떤 두 예제 사이의 차이가 나있다

?

예 1 :

for (int i = 0; i < 2; i++) 
{ 
    Thread newThread = new Thread(...); 
    newThread.Start(); 
} 

예 2 :

Thread newThread; 
for (int i = 0; i < 2; i++) 
{ 
    newThread = new Thread(...); 
    newThread.Start(); 
} 

자신의 IL 코드는 동일합니다 ... 두 번째 예에서

+0

예 @dtb는 정확한 속임수를 언급하며, 더 정확한 답변을 가지고 있습니다. 둘 다 같은 IL로 컴파일되므로 절대 차이가 없습니다. – gideon

+0

답장을 보내 주셔서 감사합니다. @dbt ... – ogun

답변

3

, 당신은 newThread와 마지막 스레드에 액세스 할 수 있습니다, 첫 번째 예에서는 불가능합니다.

두 번째 차이점은 마지막 스레드에 대한 참조를 보유하므로 가비지 수집기는 스레드가 완료되어 처리 될 때 메모리를 확보 할 수 없습니다.

new 키워드는 메모리를 할당하므로 메모리 할당에 차이가 없습니다 (this link 참조).

+0

두 번째 예제의 newThread가 해당 루프 다음에 참조되지 않으면 바로 가비지 수집을 위해 사용할 수 있습니다. 그래서 특정 시나리오에 대해 GC.KeepAlive (개체)가 필요합니다. – mgronber

+0

좋아, 나는 참조 자체가 GC가 필드를 수집하는 것을 허용하지 않을 것이라고 생각했다. – Matten

1

차이점은 분명히 변수의 범위입니다.

첫 번째 예제에서 Thread 인스턴스는 루프 이후에 더 이상 참조를 갖지 않습니다.

두 번째 예제에서 Thread 인스턴스는 여전히 루프 다음에 참조를 가지며 포함하는 블록이 종료 될 때만 해당 참조를 풀 것입니다.

2

유일한 차이점은 newThread 변수의 범위입니다.

첫 번째 예에서는 루프 내에서만 액세스 할 수 있습니다. 두 번째 예에서 루프 다음에 액세스 할 수도 있습니다.

범위를 가능한 한 제한하십시오. 따라서 루프에서 액세스 할 수있는 경우에만 첫 번째 항목을 선택하고 그렇지 않으면 두 번째 항목을 선택하십시오.

2

첫 번째 예에서 newThread은 루프 내부의 범위로 제한됩니다. 당신은 루프 외부의 다른 용도로 newThread을 사용하지 않는 경우 두 번째 예에서는 newThread 루프

에 대한 외부 범위에 존재하는 당신이 단지를 사용하고 분명 있도록, 당신은, 루프 내에서 선언해야한다 루프를 생성하는 루프.

관련 문제