C # 값 / 객체는 언제 복사되고 언제 참조가 복사됩니까?
참조하려는 객체가 복사되거나 복사하려는 객체가 참조되는 곳에서 동일한 문제가 계속해서 발생합니다. = 연산자를 사용할 때 발생합니다.
예를 들어, 객체를 다른 양식으로 보내는 경우 :
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
... 양식에서 개체를 수정하면 원본 개체는 수정되지 않습니다. 마치 개체가 참조되지 않고 복사 된 것과 같습니다. 그러나 이렇게하면 :
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
... 그리고 수정 anotherObject
, myObject
뿐만 아니라 수정됩니다.
가장 심각한 경우는 정의 된 객체 중 하나를 복제하려고 할 때입니다.
public class SomeObject
{
double value1, value2;
//default constructor here
public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}
public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}
이렇게하면 ...
SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new SomeObject();
obj2.Clone(obj1);
... obj1
참조 및 obj2
변경 사항에 대한 수정 obj1
.
int, double, string
위의 복제 방법의 경우를 제외하고, 등과 같은 시스템 객체 는 항상 복사되는 것처럼 보입니다.
내 질문은 ref
함수 에서 키워드 사용을 고려하지 않고 , 언제 객체가 복사되고 언제 객체가 모든 경우에 참조되는지 (즉, 함수에 전달할 때, 다른 객체로 설정할 때 (예 : 위의 처음 두 예), 세 번째 예와 같은 멤버 변수를 복사 할 때 등)?
단어를 신중하게 고르는 데 많은 시간을 소비하지 않고는 이런 종류의 질문에 정확하게 대답하기가 어렵습니다.
유용하다고 생각되는 몇 가지 기사에서 그렇게했습니다.
물론 기사가 완벽하다는 것은 아닙니다. 물론 그것과는 거리가 멀지 만 저는 가능한 한 명확하게하려고 노력했습니다.
한 가지 중요한 것은 머릿속에서 두 가지 개념 (매개 변수 전달 및 참조 대 값 유형)을 분리하는 것입니다.
구체적인 예를 보려면 :
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
즉 myForm.formObject
, 두 사람이 서로 다른 종이를 가지고 있고, 각각 같은 주소가 적혀 myObject
있는 것과 같은 동일한 사례를 의미 SomeObject
합니다. 종이 한 장의 주소로 가서 집을 빨간색으로 칠한 다음 두 번째 종이의 주소로 가면 빨간색 집이 보입니다.
It's not clear what you mean by "and then modify the object in the form" because the type you have provided is immutable. There's no way of modifying the object itself. You can change myForm.formObject
to refer to a different instance of SomeObject
, but that's like scribbling out the address on one piece of paper and writing a different address on it instead. That won't change what's written on the other piece of paper.
If you could provide a short but complete program whose behaviour you don't understand (ideally a console application, just to keep things shorter and simpler) it would be easier to talk about things in concrete terms.
Hi Mike All objects, which derives from ValueType, such as struct or other primitive types are value types. That means that they are copied whenever you assign them to a variable or pass them as a method parameter. Other types are reference types, that means that, when you assign a reference type to a variable, not it's value, but it's address in memory space is assigned to the variable. Also you should note that you can pass a value type as a reference using ref keyword. Here's the syntax
public void MyMethod(ref int a) { a = 25 }
int i = 20;
MyMethod(ref i); //Now i get's updated to 25.
Hope it helps :)
With regards to cloning your objects if the values you are copying from one object to another are reference types then any modification to those values in the original object will affect the values in the copied object (since they are just references to the same object)
If you need to clone an object which has properties which are reference types you need to either make those types clonable or do a manual copy of them by instantiating new instances as required.
Conside using the IClonable interface though it isn't the best of solutions imho.
'programing tip' 카테고리의 다른 글
대부분의 STL 구현의 코드가 왜 그렇게 복잡합니까? (0) | 2020.11.22 |
---|---|
ASP .NET MVC의 web.config에서 TargetFramework 설정은 무엇을 의미합니까? (0) | 2020.11.22 |
자바 스크립트 문자열 유형과 문자열 객체의 차이점은 무엇입니까? (0) | 2020.11.22 |
지도가없는 Google 장소 라이브러리 (0) | 2020.11.21 |
Pylint의 Cell-var-from-loop 경고 (0) | 2020.11.21 |