2013-02-13 2 views
-5

이 코드의 동작은 어떻게됩니까? s == "변경된 인스턴스"또는 s == "초기 인스턴스"가됩니까?더 많은 장소에서 C# 단일 인스턴스

SomeClass instance = new SomeClass(); 
instance.setName("initial instance") 

List<SomeClass> list1 = new List<SomeClass>(); 
List<SomeClass> list2 = new List<SomeClass>(); 

list1.add(instance); 
list2.add(instance); 

list2.get(0).setName("changed instance"); 
string s = list1.get(0).getName(); 

편집 : 좋아, 코드를 변경했습니다. 나는 그것을 아주 빨리 쓰고 있었다. EDIT2 : 왜 내가이 질문을하고 시도하지 않습니까? 이 컴퓨터에는 IDE가 없기 때문에 몇 가지 제한 사항이 있습니다.

+8

이런 종류의 질문을 테스트하는 가장 좋은 방법은 컴파일러에 문의하는 것입니다. – SWeko

+0

당신은 setName/getName을리스트에서 직접 호출 할 수 없다. 그것들은 인스턴스 함수들이다. list2.First(). setName (... –

+2

) 우리가 행동을 말할 수는 있지만, 왜 우리에게 묻고 있습니까? 그냥 프로그램을 실행하면 알 수 있습니다. –

답변

5

개체는 참조로 전달됩니다. 같은 개체에 대한 참조가있는 두 개의 목록이 있습니다. 따라서 하나의 목록에서 개체를 변경하면 다른 목록의 개체에 영향을줍니다. 객체가 아닌 원시 객체를 전달하면 값으로 전달됩니다. 값으로 전달되면 본질적으로 사본입니다. 따라서 한 목록의 값을 변경해도 다른 목록의 값은 변경되지 않습니다.

클래스에 "값 같은"동작을 나타내려면 클래스 자체에 복사본을 반환하는 메서드를 만들 수 있습니다. 즉, 멤버 및 속성 등을 포함하는 새 객체가 원본과 동일한 값으로 설정됩니다.

예 :

public SomeClass Clone() 
{ 
    SomeClass newSomeClass = new SomeClass(); 
    newSomeClass.setName(this.getName()); 
    return newSomeClass; 
} 

그런 코드가됩니다 :

SomeClass instance = new SomeClass(); 
instance.setName("initial instance") 

List<SomeClass> list1 = new List<SomeClass>(); 
List<SomeClass> list2 = new List<SomeClass>(); 

list1.add(instance); 
list2.add(instance.Clone()); 

list2.get(0).setName("changed instance"); 
string s = list.get(0).getName(); 

그리고 그 결과는 목록 1이 될 것이고,리스트 2는 다른 이름으로, 두 개의 서로 다른 SomeClass 인스턴스를 포함한다.

값과 참조 유형에 대한 자세한 내용은 MSDN을 참조하십시오.

+0

값 유형과 참조 유형이 모두'System.Object'에서 상속되기 때문에 이는 완전히 정확하지는 않습니다. –

+0

참이지만 MSDN은 프리미티브가 문자열 유형을 제외한 값 유형임을 명시 적으로 명시합니다. 클래스는 참조 유형입니다. [MSDN] (http://msdn.microsoft.com/en-us/library/4d43ts61%28v=vs.90%29.aspx) – sparky68967

+0

대신 내 질문에 대한 답변을 보니 좋다. 내 의사 코드를 가져 가지 마라. – John

2

하나의 인스턴스 만 만들어서 구현을 공유하기 때문에 "변경된 인스턴스"입니다.

+1

setName은 목록 항목 –

+0

의 메소드입니다. 나는 관대 한 대답에 정말 만족합니다. 그러나 이것을 의사 코드 (pseudocode)와 비슷하게 생각하십시오. 이해할 정도로 추상적 인 생각을 가지고 있기를 바랍니다. – John

+0

@ lazyberezovsky : 나는 원래의 형태로 인해 기본 'List '유형을 사용했다면 100 % 확신하지 못했습니다. 나는 개정이 명확 해지기를 바랬다. 완전한 대답은 내가 개정하고 대답 할 무렵에 게시되었다. – Guvante

3

두 목록에 개체를 추가하고 하나의 목록에서 개체를 변경하면 다른 목록은 여전히 ​​같은 개체를 참조하므로 업데이트 된 값을 갖게됩니다.

+0

'SomeClass'는 내게 안전한 가정과 같은 참조 유형이라고 가정합니다. –

관련 문제