코딩 하다보니까 조금 헷갈려서 확인차 이것 저것 해보다보니 더 헷갈렸다.
C#의 reference, value참조에 대해서 MSDN에 나와 있는 것 + 구글링 한 내용으로 정리 해 본다.
코드를 보는게 가장 빠르다.
Call By Value
public void CallByValue(int a) { a = 100; }
static void main(string args[]) { int test = 0; CallByValue(test); Console.WriteLine(test); }
결과는 0 |
Call By Reference
public void CallByReference(ref int a) { a = 100; }
static void main(string args[]) { int test = 0; CallByReference(test); Console.WriteLine(test); }
결과는 100 참고로 out을 써도 되는데 ref와 out에는 다음과 같은 차이가 있다. out : 초기화 안되도 됨 ref : 초기화 되어야만 함 |
Class경우
public class A { public int m_Int = 0; }
// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 1개 증가 public Function1(A param) { //참조카운터 2 상태 (main에서 사용하는 instance와 이 함수의 param) param.m_Int = 100;
// 동일 메모리를 가리키는 하나의 포인터 제거 의미 // 참조 카운터 1상태 (main에서 사용하는 instance는 메모리에 할당 된 A를 여전히 가리킴) param = null; }
// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 그대로 유지 public Function2(ref A param) { //참조 카운터가 증가하지 않음 // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미 param.m_int = 100;
// param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다. // 더이상 main의 instance도 null이다. param = null;
}
static void main(string args[]) { A instance = new A(); Function1(instance); Console.WriteLine(instance.m_int); //100 출력, instance는 여전히 메모리에 할당 된 영역 가리킴
Function2(instance); Console.WriteLine(Instance.m_int); // Instance는 null이므로 에러가 발생한다.
} |
Structure의 경우
public structure A { public int m_Int = 0; }
// 구조체는 instance의 값이 param에 복사된다. public Function1(A param) { param.m_Int = 100; param = null; }
public Function2(ref A param) { // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미 param.m_int = 100;
// param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다. // main의 instance도 이제 null이다. param = null;
}
static void main(string args[]) { A instance = new A(); Function1(instance); Console.WriteLine(instance.m_int); //0 출력, instance는 Function1에 값만 복사 해 줬다.
Function2(instance); Console.WriteLine(Instance.m_int); // Instance의 m_int는 100이 되었다.그러나 instance가 null이 되어 // 이 문구에서 에러가 발생하게 된다. } |
http://msdn.microsoft.com/en-us/library/0f66670z.aspx
이 문서를 참조 하였다.
'프로그래밍 > 기타' 카테고리의 다른 글
UML-클래스다이어그램 관계 정리 (1) | 2015.01.15 |
---|