본문 바로가기

C#

ref를 사용하는 경우

728x90

C# 키워드인 ref는 해당 타입 객체가 호출되는 메소드에서 변경될 수 있다는 것을 의미한다.

1. Value 타입 객체의 값을 변경하려고 할 경우

public void RunTest()
{
    int a = 10;
    int b = 20;
    int c = 30;
    bool success = Sum(a, b, ref c);
    Console.WriteLine(c);
}

public bool Sum(int a, int b, ref int sum)
{
    sum += a + b;
    return true;
}

2. Reference 타입 객체를 새로운 레퍼런스 객체로 할당할 경우
- Reference 타입 객체는 Heap 영역의 포인터만 전달하기 때문에 ref를 사용하지 않아도 해당 객체의 property나 객체 내용을 변경할 수 있다.

public void Run()
{
    DataSet ds = new DataSet();
    AddTable(ds);
    Console.WriteLine(ds.Tables.Count); // 1
}

public void AddTable(DataSet ds)
{
    DataTable dt = new DataTable("Table1");
    dt.Columns.Add("ColA", typeof(string));
    ds.Tables.Add(dt);
}

- Reference 타입 객체를 파라미터로 전달하면서 ref를 사용하는 경우는, 다른 새로운 Reference 객체를 해당 파라미터에 할당하려고 하는 경우이다. 아래 코드에서 AddTable 메서드 호출할 때 ref 키워드가 없으면 메서드 호출 이전의 ds를 그대로 유지하게 된다. 따라서 출력은 1이 아닌 0이 된다.

public void Run()
{
    DataSet ds = new DataSet();
    AddTable(ref ds);
    Console.WriteLine(ds.Tables.Count); // 1
}

public void AddTable(ref DataSet ds)
{
    DataSet newDs = new DataSet();
    DataTable dt = new DataTable("Table1");
    dt.Columns.Add("ColA", typeof(string));
    newDs.Tables.Add(dt);

    ds = newDs;
}
728x90