2009-11-02 3 views
6

C#에서 value classreference class의 정의는 무엇입니까?C#에서 값 클래스 란 무엇이며 참조 클래스는 무엇입니까?

이것은 어떻게 value typereference type과 다른가요?

나는 MCTS 자기 페이스 훈련 도구 (시험 70-536)에서 이것을 읽기 때문에 나는이 질문을 질문한다. 제 1 장, 제 1 장, 단원 검토 4 :

당신은 간단한 클래스 또는 유일한 값을 유형이 포함 구조를 만들어야합니다. 가능한 한 효율적으로 으로 실행되도록 클래스 또는 구조를 만들어야합니다. 절차를 통해 수정할 클래스 나 구조를 프로 시저로 전달할 수 있어야합니다. 다음은 당신이 작성해야하는 중 하나입니까?

은 참조 클래스

B 참조 구조는

C 값은 클래스

D 값 구조는

응답 수정 : D

는 잘못된 : 당신은 참조 클래스를 만들 수 있습니다 ; 그러나 프로 시저에 전달할 때 이 수정 될 수 있습니다.

B 올바르지 않음 : 참조 구조를 만들 수 없습니다.

C 잘못된 값 : 클래스를 만들 수 있습니다. 그러나 구조는보다 효율적으로 인 경향이 있습니다.

D 올바른 값 구조는 일반적으로 입니다.

+0

그의 질문을 편집하기 전에 그는 "유형"과 반대로 "가치 클래스"및 "참조 클래스"라고 말했습니다. 그는 이러한 라인을 따라 뭔가를 참조 할 수 있습니다 : http://www.icsi.berkeley.edu/~sather/Documentation/EclecticTutorial/node7.html 그것은 다음과 같습니다 : "근본적인 수준에서 : 가치 클래스는 한번 생성 된 객체를 정의합니다. 값 유형의 변수는 해당 변수에 다시 할당하여 만 변경할 수 있습니다. 값 클래스의 일부분 (한 속성, 말하자면)을 수정하고자 할 때 우리는 전체 객체를 재 할당해야합니다 "... 기사에 대한 링크가 없으면 누가 압니까? –

+1

질문을 수정하지 않았습니다. 누군가 나를 위해 그것을했다. 그것은 나쁜 판이다. 나는 "value class"와 "reference class"를 의미합니다. –

+0

예, 귀하의 질문을 편집 한 사람은 George Stocker였습니다. 나는 당신이 타이핑 한 것을 정확하게 의미 할 수도 있음을 지적했습니다. 방금 그걸 분명히 한 것처럼 보입니다. –

답변

2

값 유형이 값에 의해 전달된다.

편집 :는 '값 클래스'또는 C#에서 '참조 클래스'의 개념이 없습니다
값/참조 클래스, 그래서 그 정의를 요구하는 것은 논쟁이다.

+2

아마도 그가 우리에게 참조하는 문서에 대한 링크 ... –

+0

문서 참조를 추가했습니다 –

+1

참조 유형은 값으로 전달되지만 참조는 전달됩니다. 이것은 미묘하지만 중요한 구분입니다. – Wedge

3

제목에 대해서는 the overview을 참조하십시오. 그러나 msnd 링크를 심각하게 따르고 전체 Common Type system 장을 읽으십시오. (첫 번째 질문에서 의견을 물을 수도 있음)

1

값 유형은 실제 데이터를 저장하고 참조 유형은 데이터에 대한 참조를 저장합니다. 참조 유형은 힙에 동적으로 저장되는 반면 값 유형은 스택에 저장됩니다.

값 유형 : http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx 참조 형식 : 참조 형식이 참조에 의해 전달되는 동안 http://msdn.microsoft.com/en-us/library/490f96s2.aspx

+2

정확하지 않습니다. 클래스 필드 인 값 유형은 나머지 오브젝트 상태 중 힙에 저장됩니다. – zvolkov

+1

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – Joren

+0

예 설명이 조금 지나치게 단순했습니다 – jtruelove

1

값 유형 (즉, 이름을 사용하여 참조 할 때)은 데이터가있는 메모리의 위치를 ​​나타냅니다.따라서 메모리 위치가 "아무 것도 나타내지 않습니다"라고 말할 수있는 방법이 없기 때문에 값 유형을 null로 설정할 수 없습니다. 기본적으로 값 형식을 값으로 전달합니다. 즉, 메서드에 전달한 개체는 메서드 실행의 결과로 변경되지 않습니다.

참조 유형 개체를 사용하면 실제로 변장에 포인터가 사용됩니다. 이름은 메모리 위치를 참조하며, 메모리 위치는 객체가 실제로 사는 메모리 내의 위치를 ​​참조합니다. 따라서 참조 유형에 null을 할당 할 수 있습니다. 참조 유형에 "나는 아무데도 가리 킵니다."라는 말을하기 때문에 null을 할당 할 수 있습니다. 참조 유형을 사용하면 메서드를 실행 한 결과로 객체를 변경할 수 있으므로 메서드 호출에 전달하여 myReferenceObject의 속성을 변경할 수 있습니다.

0

참조 유형은 값에 따라 참조 및 값 유형에 의해 메소드에 전달됩니다. 후자의 경우 메소드는 변수의 사본을 받고 전자에서는 원본 데이터에 대한 참조를받습니다. 복사본을 변경하면 원본은 변경되지 않습니다. 참조가있는 원본 데이터를 변경하면 데이터 참조가 변경되는 곳마다 데이터가 변경됩니다. C# 프로그램과 유사한 프로그램이 C로 작성된 경우 일반적으로 참조 유형은 포인터 및 값 유형을 사용하는 데이터와 같이 스택의 정상 데이터가됩니다.

숫자 유형, 문자, 날짜, 열거 및 구조는 모두 값 유형입니다. 문자열, 배열, 델리 게이션 및 클래스 (즉, 대부분의 항목)는 참조 유형입니다.

2

C#과 달리 사용자가 "값 클래스"또는 "참조 클래스"를 선언 할 수있는 C++/CLI를 생각할 수도 있습니다. C#에서는 선언 한 모든 클래스가 암시 적으로 참조 클래스가됩니다. 기본 제공 형식, 구조체 및 열거 형 만 값 의미를가집니다. http://www.ddj.com/cpp/184401955

값 클래스가 심판 클래스에 비해 약간의 기능을 가지고 있고, "평범한 오래된 데이터"에 대한 유용하다 : 여기에 보면, C++/CLI에서 값 클래스에 대해 읽으려면 즉, 신원이없는 데이터입니다. 데이터를 할당 할 때 데이터를 복사하기 때문에 시스템은 데이터를 다른 객체로 단순히 복사하는 기본 (및 필수) 복사 생성자를 제공합니다.

값 클래스를 참조 클래스 (이를 가비지 수집 힙에 넣음)로 변환하려면 "상자에 넣기"를 할 수 있습니다.

당신이 쓰고있는 수업이 하나인지 다른 것인지를 결정하려면 그것이 신분을 가지고 있는지 스스로에게 물어보십시오. 이는 대개 어떤 상태가 있거나 식별자 나 이름 또는 자체 컨텍스트 (예 : 근처 노드를 가리키는 노드)의 개념을 가짐을 의미합니다.

그렇지 않으면 아마 가치 클래스 일 것입니다.

그러나 C#에서는 값 클래스가 "structs"로 선언됩니다.

0

내 이해가 정확하다면 생성자를 통해 초기화 된 readonly 멤버 변수를 사용하여 "값 클래스"또는 변경 불가능한 클래스를 수행 할 수 있습니다. 일단 생성되면 변경할 수 없습니다.

관련 문제