우선 아래의 결과를 예측해 보자.
using System;
using System.Collections.Generic;
using System.Text;
namespace RefByRef
{
class AnotherClass
{
public int ID;
}
class SomeClass
{
public AnotherClass ChangeObject(ref AnotherClass ref1)
{
ref1.ID = ref1.ID*2;
return ref1;
}
public void SubtleChange(ref AnotherClass ref1, AnotherClass ref2)
{
ref1 = new AnotherClass();
ref1.ID = 999;
ref2 = new AnotherClass();
ref2.ID = 999;
}
}
class Program
{
static void Main(string[] args)
{
SomeClass sc = new SomeClass();
AnotherClass mref1 = new AnotherClass();
mref1.ID = 3;
AnotherClass mref2 = sc.ChangeObject(ref mref1);
Console.WriteLine("ref1.ID = {0}, ref2.ID = {1}", mref1.ID, mref2.ID);
sc.SubtleChange(ref mref1, mref2);
Console.WriteLine("ref1.ID = {0}, ref2.ID = {1}", mref1.ID, mref2.ID);
}
}
}
첫번째 출력은 대부분 ref1.ID = 6 ref2.ID = 6 으로 예측했을 것이다.
하지만 두번째 출력을 혹시 ref1.ID = 999, ref2.ID = 999라고 생각하지 않았는가?
아쉽지만 오답이다. 정답은 ref1.ID = 999, ref2.ID = 6 이다.
공짜! 기술 서적인 이 예제의 원본이 있는 InsideC# 번역서도 심지어 다음과 같은 말을 한다.
"참조로 reference 타입 파라미터를 넘긴다면, 값으로 reference 타입 파라미터를 넘기는 것과 결과는 다르지 않을 것이다."
'Development > C#' 카테고리의 다른 글
| DataGridView 성능 높이기 (0) | 2009.09.15 |
|---|---|
| 월중 첫날짜, 마지막날짜 구하기 (0) | 2009.09.01 |
| 동적으로 메서드 실행 (0) | 2009.08.31 |
| Custom ToolStrip, MenuStrip Demo (0) | 2009.08.31 |
| 네트워크 드라이브 연결하기 (0) | 2009.08.27 |