2017-03-20 9 views
0

저는 C#에 익숙하지 않아서 참조 형식은 메모리에있는 다른 개체 (예 : 힙)에 대한 참조를 저장하는 형식입니다. 내 질문은 다른 클래스를 멤버 변수로 보유하는 클래스가 있으면 클래스 멤버 변수도 참조를 저장합니까? 저는 여러분이 클래스 멤버 변수를 자신이 소유하고있는 객체의 수명에 묶고 싶을 때가 많기 때문에 이러한 멤버 변수가 메모리에있는 다른 객체에 대한 참조를 저장하는 것은 이해가되지 않기 때문에 묻습니다. 이렇게하면 이러한 변수에 대한 값을 찾을 때 불필요한 간접 참조가 추가됩니다. 이제이 문제를 해결하는 방법 중 하나는 멤버 변수를 구조체로 만드는 것입니다.하지만 멤버 변수에 상속 또는 다른 클래스 전용 기능이 필요한 경우 어떻게해야합니까? 모든 통찰력이 인정됩니다.참조 형식 멤버가있는 C# 참조 형식

+0

'이것에 대한 한 가지 방법은 멤버 변수를 structs' <= nope로 만드는 것입니다. http://stackoverflow.com/a/1932787/1260204 및 https://blogs.msdn.microsoft.com/ ericlippert/2009/04/27/the-stack-is-an-implementation-detail-part-one/ – Igor

+1

@Igor 아니요, Jason이 맞습니다. 문제는 내부 객체가 스택에 있는지 여부가 아니라 외부 객체가 참조 또는 내부 객체 자체를 저장하는지 여부입니다. –

+0

@NicoSchertler - 아, 잘못 읽었습니다. – Igor

답변

5

당신은 당신의 클래스 멤버 변수가 소유하는 개체의 수명

음,는 소유의 수명에 묶여 있습니다 멤버 변수에 를 연결해야 할 많은 시간 목적. 소유 객체 인스턴스가 가비지 수집되는 즉시 (멤버 객체에 대한 다른 참조가없는 한) 가비지 수집 대상이됩니다.

언어와 개념에 익숙해 짐에 따라 거의 모든 상황에서 참조 유형을 사용하는 것이 매우 바람직하다는 것을 알게 될 것입니다. 구조체와 같은 값 유형을 클래스 대신 정의하려는 제한된 상황이 있으며 클래스 위에 struct를 선택하는 결정은 클래스 인스턴스의 수명과 관련이 없습니다. MSDN for guidance on choosing between a class and a struct을 참조하십시오.

0

제 질문은 다른 클래스를 멤버 변수로 보유하고있는 경우 해당 클래스 멤버 변수에도 참조를 저장합니까?

... 당신은 당신의 클래스 멤버 변수가 소유하는 개체의 수명에 묶여 수 ...이 주위에 한 가지 방법은 그 멤버 변수 구조체를 만드는 것입니다하지만 만약 원하는 이러한 멤버 변수는 상속 또는 다른 클래스 전용 기능이 필요합니까?

더 이상 참조가 없으면 모든 객체가 가비지 수집으로 플래그 지정되므로 구조체 대신 클래스를 사용합니다. 구조체는 클래스에 비해 희귀 품종입니다.