2010-06-27 3 views
3

안녕하세요 사람들은 다음과 같은 예를C#을 패스

public void main() 
{ 

    int x = 1; 

    Foo(x); 
} 

public void Foo(int y) 
{ 
    y = 5; 
} 

우리는 C#을 인수 값 유형 값에 의해 전달되는 알을 궁금해. 위의 예에서 스택에 2 개의 복사본이 있는데, 하나는 x에, 하나는 y에 대한 의미입니까?

감사

+0

까다 롭습 니다만 위의 코드는 첫 번째 경우 컴파일되지 않습니다. p – Syd

+0

이제 행복합니까? –

답변

14

예, 스택에 두 개의 독립 변수가있을 것입니다. 두 개의 다른 스택 프레임에도 있습니다. 하나는 main이고 다른 하나는 foo (인라인이 없다고 가정)입니다. Foo 반환, x의 값이 여전히 사실 일이 아닌 5

될 것입니다 때, 인수는 참조 형식과 값 형식 모두 C#에서 기본적으로 값에 의해 전달 항상이 있습니다. 유일한 차이점은 참조 유형의 경우 인수 값 참조이며 객체 자체는 아닙니다.

자세한 내용은 내 article on parameter passing을 참조하십시오.

스택의 실제 동작은 implementation detail입니다. C# 컴파일러는 프로그램이 사양에 정의 된대로 동작하는지 확인해야하지만 스택 또는 힙 동작을 요구하지는 않습니다. 따라서 x은 코드 끝에 1 값을 가져야하지만 유효한 C# 컴파일러 xy을 힙에 넣을 수 있습니다.

+0

감사합니다 존, 나는 스타가 강타했다고 생각합니다. Cant는 다가올 책을 기다립니다. in-lining에 대한 질문. 컴파일러가 메서드 호출을 인라인할지 여부를 어떻게 결정합니까? –

+0

아니면 스택이나 힙이 될 수 없습니다. (1) 레지스터에 넣는 코드를 생성하거나 (2)이 코드가 아무 것도하지 않고 부작용이없고 * jit 시간에 결정될 수 있으므로 * 전혀 코드를 생성하지 않는 것이 합리적입니다. –

+2

@ ash2010 : C# 컴파일러는 아무 것도 인라인하지 않습니다. JIT 컴파일러는 인라이닝을 수행하고 CLR v4에서는 인라이닝을 결정했을 때 알려줍니다! http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/jit-etw-tracing-in-net-framework-4.aspx –

4

당신은 제대로 이해 - x의 값은 main 함수의 스택 프레임에 스택에 넣어되며, y의 값은 Foo에 대한 스택 프레임의 스택에 배치됩니다.

1

자세한 내용은 값 매개 변수 전달 방법을 이해해야합니다. Foo에서 y가 Main에서 x에 영향을 미치지 않는 이유는 서로 다른 스택 프레임에 있기 때문입니다. 전달 값 유형 매개 변수에 대한 자세한 내용은 HERE입니다.

+0

내가 그 페이지를 좋아한다고 말할 수 없다. . 예를 들어, 값 유형을 구체적으로 호출하고 다음과 같이 말합니다. "따라서 값 유형 변수를 메소드에 전달한다는 것은 변수의 사본을 메소드에 전달하는 것을 의미합니다." 참조 유형에도 마찬가지입니다. (글쎄, 그것은 변수의 * value * 사본을 의미한다고 가정하면 변수 자체를 복사하지 않습니다.) 참조 유형 변수의 경우 값은 참조입니다. 그 값은 기본적으로 여전히 복사됩니다 ... –