본문으로 바로가기
우선 아래의 결과를 예측해 보자.

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