2017-12-22 4 views
2

C 프로그래밍 언어에서 포인터가 다른 포인터에 할당 된 것을 기억하는 한 원래 값에 액세스하기 위해 ** 접두어를 사용합니다.C# 컴파일러는 컴파일하는 동안 참조의 참조를 해석합니까?

개체 인스턴스를 메서드에 ref Myobject myObject 인수로 전달할 때 어떻게 작동합니까? C#이 객체의 힙 주소를 확인하고 printSomething 같은 코드에서 호출합니까?

void testFunction(ref MyObject myObject){ 
    myObject.printSomething(); 
} 

그래서이 함수가 재귀 함수이면 컴파일러는 객체를 찾을 때까지 참조 주소를 따릅니다.

아래 테스트 시나리오를 추가합니다.

public class Test 
{ 


    public Test() 
    { 
     StringBuilder str = new StringBuilder(); 
     Function(ref str); 
     Console.WriteLine(str.ToString()); 
    } 

    int referenceCount = 0; 

    int Function(ref StringBuilder sBuilder) 
    { 
     referenceCount++; 

     if (referenceCount == 100) 
     { 
      sBuilder.Append("foo"); 
      return referenceCount; 
     } 

     Function(ref sBuilder); 
     return referenceCount; 
    } 

    public static void Main(string[] args) 
    { 
     new Test(); 
     Console.ReadLine(); 
    } 

} 

각 방법에 대해 내가 마지막에 메소드를 호출하고 서로에 100을 연결하는 새로운 기준이 stack.After에 예약되어 전화 때문에 예상대로 블록이 흐름에 예외를 통해 스택을 제공 있다면 제거합니다. sBuilder.Append("foo"); 코드가 객체에 도달 할 때까지 링크 된 참조를 따릅니 까?

+0

포인터는 개체의 시작 주소입니다. 객체의 구조는 C# 및 C 언어에서 동일하게 정의되어야합니다. C#가 관리되기 때문에 개체는 마샬링 기술을 사용하여 관리되지 않는 메모리로 이동해야합니다. 두 개의 별표를 사용하는 것은 포인터가 배열에 대한 주소의 주소에 대한 주소임을 의미 할 수 있습니다. 컴파일은 아무 것도하지 않고 모든 올바른 정의를 수행해야합니다. 컴파일은 객체의 시작 주소를 스택에 저장합니다. – jdweng

+1

예제에서 'myObject'를 다시 할당하지 않으므로'ref' 키워드는 전혀 쓸모가 없습니다. 물론'printSomething'이 제공된 인스턴스에 대해 호출됩니다. 나는 다른 어떤 것도 볼 수 없다. 네가 묻는 것을 이해하지 못한다. – HimBromBeere

+0

조금 명확하게하기위한 테스트 시나리오를 추가했습니다. 나는 내가 더 분명하게되기를 바란다. – trueLife

답변

0

이 부분을보세요. article.

C#의 참조가 C++의 포인터가 아닙니다. 이것은 다른 개념입니다.

메서드의 매개 변수 목록에서 사용될 때 ref 키워드는 값이 아닌 참조로 전달된다는 것을 나타냅니다. 참조로 전달하는 의 결과는 호출 된 메서드에 호출 된 메서드의 인수가 변경되었음을 나타냅니다. 예를 들어 호출자 이 로컬 변수 표현식 또는 배열 요소 액세스 표현식을 전달하고 호출 된 메소드가 참조 매개 변수가 참조하는 객체를 바꾼 경우 호출자의 로컬 변수 또는 배열 요소가 이제 새로운 메서드가 반환 될 때의 객체입니다.

관련 문제