내보내기(0) 인쇄
모두 확장
이 문서는 수동으로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오.
번역
원본

ref(C# 참조)

ref 키워드는 인수를 참조로 전달하는 데 사용됩니다. 메서드의 모든 매개 변수 변경 사항은 호출하는 메서드로 제어가 다시 전달될 때 해당 변수에 반영됩니다.

참고참고

참조에 의한 전달 개념을 참조 형식의 개념과 혼동하지 마십시오. 두 개념은 같지 않습니다. 메서드 매개 변수는, 값 형식이든 참조 형식이든 관계없이 ref로 수정될 수 있습니다. 참조에 의해 전달되는 경우에는 값 형식의 boxing이 없습니다.

ref 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 ref 키워드를 명시적으로 사용해야 합니다. 예를 들면 다음과 같습니다.


    class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }



ref 매개 변수에 전달되는 인수는 먼저 초기화되어야 합니다. 이는 해당 인수를 전달하기 전에 명시적으로 초기화할 필요가 없는 out과 다른 점입니다. 자세한 내용은 out을 참조하십시오.

ref out 키워드는 다른 런타임 동작을 가져오지만 컴파일 타임에 메서드 시그니처의 일부로 간주되지 않습니다. 따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 것이 유일한 차이점인 경우 메서드를 오버로드할 수 없습니다. 예를 들어, 다음 코드는 컴파일되지 않습니다.


class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}


그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지 않는 경우 다음 예제에서와 같이 메서드를 오버로드할 수 있습니다.


    class RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }



속성은 변수가 아닙니다. 실제로 속성은 메서드이기 때문에 ref 매개 변수로 전달될 수 없습니다.

배열을 전달하는 방법에 대한 자세한 내용은 ref 및 out을 사용하여 배열 전달(C# 프로그래밍 가이드)을 참조하십시오.

이 항목의 앞부분에서 설명하는 것과 같이 값 형식을 참조로 전달하는 방법이 유용하기는 하지만 ref를 사용하여 참조 형식을 전달하는 방법도 유용한 경우가 많습니다. 이렇게 하면 참조 자체가 참조로 전달되므로 호출된 메서드에서 참조가 가리키는 개체를 수정할 수 있습니다. 다음 샘플에서는 참조 형식이 ref 매개 변수로 전달될 때 개체 자체가 변경될 수 있음을 보여 줍니다. 자세한 내용은 참조 형식 매개 변수 전달(C# 프로그래밍 가이드)을 참조하십시오.


class RefExample2
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        Console.WriteLine(str);
    }
}
// Output: changed


자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.

커뮤니티 추가 항목

추가
표시:
© 2015 Microsoft