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");
코드가 객체에 도달 할 때까지 링크 된 참조를 따릅니 까?
포인터는 개체의 시작 주소입니다. 객체의 구조는 C# 및 C 언어에서 동일하게 정의되어야합니다. C#가 관리되기 때문에 개체는 마샬링 기술을 사용하여 관리되지 않는 메모리로 이동해야합니다. 두 개의 별표를 사용하는 것은 포인터가 배열에 대한 주소의 주소에 대한 주소임을 의미 할 수 있습니다. 컴파일은 아무 것도하지 않고 모든 올바른 정의를 수행해야합니다. 컴파일은 객체의 시작 주소를 스택에 저장합니다. – jdweng
예제에서 'myObject'를 다시 할당하지 않으므로'ref' 키워드는 전혀 쓸모가 없습니다. 물론'printSomething'이 제공된 인스턴스에 대해 호출됩니다. 나는 다른 어떤 것도 볼 수 없다. 네가 묻는 것을 이해하지 못한다. – HimBromBeere
조금 명확하게하기위한 테스트 시나리오를 추가했습니다. 나는 내가 더 분명하게되기를 바란다. – trueLife