키워드가 없는 매개 변수로 값 유형 ( int
, struct
등)을 ref
전달하면 해당 변수의 사본이 메소드에 전달되지만 ref
키워드를 사용하면 해당 변수에 대한 참조가 전달됩니다. 새로운 것이 아닙니다.
그러나 ref
키워드가 없어도 클래스와 같은 참조 유형을 사용 하면 사본이 아닌 메소드에 참조가 전달됩니다. 그렇다면 ref
키워드를 참조 유형과 함께 사용하는 것은 무엇 입니까?
예를 들어 보자.
var x = new Foo();
다음의 차이점은 무엇입니까?
void Bar(Foo y) {
y.Name = "2";
}
과
void Bar(ref Foo y) {
y.Name = "2";
}
답변
foo
사용 하는 포인트를 변경할 수 있습니다 y
.
Foo foo = new Foo("1");
void Bar(ref Foo y)
{
y = new Foo("2");
}
Bar(ref foo);
// foo.Name == "2"
답변
실제 참조 를 수정하려는 경우가 있지만 대상이 아닌 오브젝트는 다음과 같습니다.
void Swap<T>(ref T x, ref T y) {
T t = x;
x = y;
y = t;
}
var test = new[] { "0", "1" };
Swap(ref test[0], ref test[1]);
답변
Jon Skeet은 C #에서 매개 변수 전달에 대한 훌륭한 기사를 썼습니다 . 값, 참조 ( ref
) 및 출력 ( out
) 별로 매개 변수 전달의 정확한 동작 및 사용법을 명확하게 설명합니다 .
다음은 ref
매개 변수 와 관련하여 해당 페이지에서 중요한 인용문입니다 .
참조 매개 변수는 함수 멤버 호출에 사용 된 변수의 값을 전달하지 않습니다. 변수 자체를 사용합니다. 함수 멤버 선언에서 변수의 새 스토리지 위치를 작성하는 대신 동일한 스토리지 위치가 사용되므로 함수 멤버의 변수 값과 참조 매개 변수의 값은 항상 동일합니다. 참조 매개 변수에는 선언과 호출의 일부로 ref 수정자가 필요합니다. 즉 참조로 무언가를 전달할 때 항상 명확합니다.
답변
여기에 아주 잘 설명되어 있습니다 :
http://msdn.microsoft.com/en-us/library/s6938f28.aspx
기사에서 요약 :
참조 유형의 변수는 데이터를 직접 포함하지 않습니다. 데이터에 대한 참조를 포함합니다. 참조 유형 매개 변수를 값으로 전달하면 클래스 구성원의 값과 같이 참조가 가리키는 데이터를 변경할 수 있습니다. 그러나 참조 자체의 값을 변경할 수는 없습니다. 즉, 동일한 참조를 사용하여 새 클래스에 메모리를 할당하고 블록 외부에 유지시킬 수 없습니다. 그렇게하려면 ref 또는 out 키워드를 사용하여 매개 변수를 전달하십시오.
답변
ref 키워드로 참조 유형을 전달하면 참조로 참조를 전달하며 호출하는 메소드는 매개 변수에 새 값을 지정할 수 있습니다. 이 변경 사항은 호출 범위로 전파됩니다. ref가 없으면 참조가 값으로 전달되며 이러한 일이 발생하지 않습니다.
C #에는 ref와 비슷한 ‘out’키워드가 있습니다. 단, ‘ref’를 사용하면 메소드를 호출하기 전에 인수를 초기화해야하며 ‘out’을 사용하면 수신 메소드에 값을 지정해야합니다.
답변
전달 된 참조를 수정할 수 있습니다. 예 :
void Bar()
{
var y = new Foo();
Baz(ref y);
}
void Baz(ref Foo y)
{
y.Name = "2";
// Overwrite the reference
y = new Foo();
}
당신은 또한 사용할 수 있습니다 밖으로 참조가 전달에 대해 상관하지 않는 경우 :
void Bar()
{
var y = new Foo();
Baz(out y);
}
void Baz(out Foo y)
{
// Return a new reference
y = new Foo();
}
답변
또 다른 코드
class O
{
public int prop = 0;
}
class Program
{
static void Main(string[] args)
{
O o1 = new O();
o1.prop = 1;
O o2 = new O();
o2.prop = 2;
o1modifier(o1);
o2modifier(ref o2);
Console.WriteLine("1 : " + o1.prop.ToString());
Console.WriteLine("2 : " + o2.prop.ToString());
Console.ReadLine();
}
static void o1modifier(O o)
{
o = new O();
o.prop = 3;
}
static void o2modifier(ref O o)
{
o = new O();
o.prop = 4;
}
}
