2014-10-30 3 views
1

for 또는 foreach 사용 여부에 따라 아래 출력이 달라지는 이유는 무엇입니까? foreach를 사용하면 각 요소의 값을 변경할 때 참조를 변경하지 않습니까? $ row = "d"를 쓰면 그 요소가 "d"가 될 것이라고 생각했을 것입니다.하지만 분명히 그렇게하지는 않습니다. 마치 $ row가 복사 일뿐입니다. 복사되는 루프 내부 요소 foreach (및 ForEach-Object) 결과를 이용Foreach 대 요소 변경

[Collections.Generic.List[String]]$list = New-Object '[Collections.Generic.List[String]]' 
$list.Add("a") 
$list.Add("b") 
$list.Add("c") 

#foreach ($row in $list) 
for ($i = 0; $i -lt $list.Count; $i++) 
{ 
#$row = "d" 
$list[$i] = "d" 
} 

Write-Host $list 

<# 
Output: with foreach: "a b c" 
with for: "d d d" 
#> 
+0

무엇을 의미합니까? 내 코드에는 C#이 없으며 순수한 Powershell입니다. –

+0

내 실수. '[Collections.Generic.List [String]]'에 대한 모든 언급은 C#과 관련이 있습니다. 아마 내 파워 쉘 버전이 너보다 낮을 수도있다. – Matt

+0

@Matt C#은 Powershell과 같은 언어 일 뿐이며 .NET Framework를 대상으로합니다. Collections.Generic.List [문자열] 당신이 C#에서 사용할 수있는 .NET에서 단지 클래스 (Collections.Generic.List ) 또는 PowerShell은 ([Collections.Generic.List는 [문자열]]) –

답변

1

. 루프 내에서 변경할 수 있지만 일단 범위를 벗어나면 사라집니다.

+1

이 정말 문제입니다 범위 및 자식 범위 작동 방법 이해. 나는 그것에 관해 더 많은 것을보고 싶었을 것이다. 즉'get-help about_scopes'라고 말하거나 범위에 대해 말하는 [기술 페이지에 대한 링크] (http://technet.microsoft.com/en-us/library/hh847849.aspx)를 제공하십시오. – TheMadTechnician

+1

나는 그것이 단지 스코프보다 더 많은 것과 관련이 있다고 생각한다. 해당 변수가 블록에 대해 로컬 인 경우 (및 해당 변수가있는 경우) 예상되는 포스터와 같은 참조 였지만 범위는 참조 된 개체를 계속 업데이트하기 때문에 중요하지 않습니다. 그것이 복사본이라는 사실이 여기 실제 문제입니다. – briantist

+0

@briantist 복사 된 참조 ($ row)에 새로운 참조 (문자열 개체 "d"를 가리키는 포인터)가 할당되고 원본 참조가 변경되지 않으므로 참조 된 개체가 업데이트되지 않습니다. 그런 다음 범위가 foreach 루프 내에 있기 때문에 가비지 수집되고 복사 된 원래 개체는 그대로 유지됩니다. –