우선 아래의 결과를 예측해 보자.
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 |