C #의 참조에 의한 전달 및 값에 의한 전달 개념의 맥락에서 심층 복사 및 얕은 복사에 대한 일반적인 질문이 있습니다.
C #에서는 포인터 / 참조를 허용하는 메서드를 명시 적으로 생성해야 메서드에 전달할 수 있습니다. 그러나 적어도 메서드 / 생성자에 매개 변수로 전달 된 개체는 나머지 개체와 다르게 동작합니다. http://zetcode.com/lang/csharp/oopii/에 설명 된대로 추가 복제가 수행되지 않으면 항상 참조로 전달되는 것 같습니다 .
객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까? 이러한 경우에 int, double, boolean 등과 같은 객체를 처리하는 대신 복제 프로세스를 강제하는 것이 특별한 이점이 있습니까?
다음은 내가 의미하는 바를 보여주는 코드 예제입니다.
using System;
public class Entry
{
public class MyColor
{
public int r = 0;
public int g = 0;
public int b = 0;
public double a = 1;
public MyColor (int r, int g, int b, double a)
{
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
}
public class A
{
public int id;
public MyColor color;
public MyColor hiddenColor;
public A (int id, MyColor color)
{
this.id = id;
this.color = color;
}
}
static void Main(string[] args)
{
int id = 0;
MyColor col = new MyColor(1, 2, 3, 1.0);
A a1 = new A(id, col);
A a2 = new A(id, col);
a1.hiddenColor = col;
a2.hiddenColor = col;
a1.id = -999;
id = 1;
col.a = 0;
Console.WriteLine(a1.id);
Console.WriteLine(a2.id);
Console.WriteLine(a1.color.a);
Console.WriteLine(a2.color.a);
Console.WriteLine(a1.hiddenColor.a);
Console.WriteLine(a2.hiddenColor.a);
}
}
결과는 다음과 같습니다.
-999
0
0
0
0
의 인스턴스 MyCol
는 항상 참조로 전달되는 반면 다른 인수는 값으로 전달됩니다. 나는 ICloneable을 클래스 MyColor
와 A
. 반면에 ´ref´ 문은 명시 적으로 참조에 의한 전달을 허용하고 수행하는 데 사용해야하는 C #에 있습니다.
제안을 환영합니다!
객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까?
그들은 아니다.
이러한 경우에 int, double, boolean 등과 같은 객체를 처리하는 대신 복제 프로세스를 강제하는 것이 특별한 이점이 있습니까?
참조 유형에 대한 "복제 프로세스"는 없으며 값 유형에만 해당됩니다.
다른 개념을 혼동하고 있다고 생각합니다.
값 유형 대 참조 유형
값 유형 (예 : 기본 숫자 유형, 열거 형 및와 같은 구조 DateTime
)의 경우 변수 값은 객체 자체입니다. 변수를 다른 변수에 할당 (또는 값으로 매개 변수로 전달)하면 객체의 복사본이 생성됩니다.
참조 유형 (예 : object
,, string
클래스 (구조체 아님) 등)의 경우 변수 값은 객체에 대한 참조입니다. 변수를 다른 변수에 할당 (또는 값으로 매개 변수로 전달)하면 참조의 복사본이 만들어 지므로 여전히 동일한 개체 인스턴스를 참조합니다.
값으로 매개 변수 전달과 참조로 전달
값으로 매개 변수를 전달한다는 것은 값의 사본을 전달 함을 의미합니다. 값 유형인지 참조 유형인지에 따라 객체 자체의 복사본 또는 참조의 복사본을 의미합니다. 호출 수신자가 매개 변수로 전달 된 값 유형의 멤버를 수정하는 경우 호출자는 사본에서 작업 중이므로 변경 사항을 볼 수 없습니다. 반면, 호출 수신자가 매개 변수로 전달 된 참조 유형의 멤버를 수정하는 경우 호출 수신자와 호출자 모두 동일한 개체 인스턴스에 대한 참조가 있기 때문에 호출자에게 변경 내용이 표시됩니다.
참조로 매개 변수를 전달한다는 것은 변수 (값 유형 또는 참조 유형의 변수 일 수 있음)에 대한 참조를 전달 함을 의미합니다. 값은 복사되지 않으며 호출자와 수신자간에 공유됩니다. 따라서 호출 수신자가 변경 한 사항 (매개 변수에 대한 새 값 할당 포함)은 호출자가 볼 수 있습니다.
ref
또는 out
키워드를 사용하여 달리 지정하지 않는 한 모든 매개 변수는 참조 유형을 포함하여 값으로 전달됩니다. 참조 유형의 경우 전달되는 값은 참조이지만 여전히 값으로 전달됩니다.
더 나은 설명을 위해 Jon Skeet의 C #에서 매개 변수 전달 기사를 읽어 보시기 바랍니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다