>  기사  >  백엔드 개발  >  C#의 값 유형과 참조 유형 간의 차이점 비교

C#의 값 유형과 참조 유형 간의 차이점 비교

巴扎黑
巴扎黑원래의
2017-09-06 11:13:441584검색

CLR은 값 유형과 참조 유형이라는 두 가지 유형을 지원합니다. FCL의 유형은 대부분 참조 유형인 것 같지만 가장 일반적으로 사용되는 유형은 값 유형입니다. 참조 유형은 항상 관리되는 힙에서 할당됩니다. new 연산자를 사용하여 개체를 인스턴스화하면 반환된 개체 메모리 주소가 변수에 저장됩니다. 참조 유형을 사용할 때 이해해야 할 네 가지 심리적 요소가 있습니다.

    1. 메모리는 관리되는 힙에서 할당되어야 합니다.

   2. 힙에 할당된 각 개체에는 사용하기 전에 초기화해야 하는 추가 멤버가 있습니다.

    3. 객체의 다른 바이트는 항상 0으로 설정됩니다.

     4. 관리되는 힙에서 개체를 할당할 때 가비지 수집이 강제로 수행될 수 있습니다.

참조 유형을 남용하면 필연적으로 과부하가 발생한다는 것을 알 수 있습니다. 값 유형을 다시 살펴보면 경량 유형이며 일반적으로 스레드 스택에 할당되며 이를 전달하는 변수에는 인스턴스에 대한 포인터가 포함되어 있지 않습니다. 가비지 수집기에 의해 제어되지 않으므로 값 유형을 사용하면 관리되는 힙에 대한 부담이 완화되고 애플리케이션 수명 동안 가비지 수집 수가 줄어듭니다.

  C#에서 '클래스'라고 부르는 것은 참조 유형이고 값 유형은 구조 또는 열거형입니다. 모든 구조는 추상 유형 System.ValueType에서 직접 파생됩니다. 그리고 그 자체는 Object에서 직접 파생되고 모든 열거형은 System.Enum 추상 형식에서 파생되며 Enum은 ValueType에서 파생되며 모두 서로 연결됩니다.

자신만의 타입을 디자인할 때 언제 값타입으로 정의하시나요?

    1. 해당 유형은 기본 유형(컴파일러에서 직접 지원하는 데이터 유형(예: Int32, Int64 등))의 동작을 갖습니다.

    2. 유형은 다른 유형을 상속할 필요가 없습니다.

   3. 해당 유형은 다른 유형을 파생하지 않습니다.

   4. 값 유형은 실제 매개변수나 반환값으로 사용될 때 해당 필드를 복사해야 하기 때문에 인스턴스가 너무 크면 특정 성능 손실이 발생할 수 있습니다.

    따라서 타입 인스턴스는 작아야 하고(16바이트 이내) 인스턴스는 커야 하지만, 이를 메소드의 실제 매개변수로 전달하고 메소드에서 반환할 필요는 없습니다.

값 유형과 참조 유형의 차이점과 관련하여 몇 가지 사항은 다음과 같습니다.

   1. 참조 유형은 boxed 형태이고 값 유형은 unboxed 형태입니다. 둘은 특정 방식으로 서로 변환될 수도 있습니다. (구체적인 지침은 다음 블로그에서 자세히 설명하겠습니다)

   2. 값 유형에는 새로운 가상 메서드가 도입되어서는 안 됩니다. 모든 메서드는 추상화될 수 없으며 덮어쓰기를 방지하기 위해 암시적으로 봉인됩니다.

  3. 값 유형 변수를 다른 값 유형 변수에 할당하면 필드별 복사가 수행됩니다. 참조 유형의 변수를 다른 참조 유형에 할당하면 메모리 주소만 복사됩니다. 두 개 이상의 참조 유형 변수는 힙의 동일한 개체를 참조할 수 있으며, 한 변수에 대해 수행된 작업은 다른 변수에서 참조하는 개체에 영향을 줄 수 있습니다. 반면, 값 유형 변수는 독립적이며 서로 영향을 미치지 않습니다.

   4. unboxed 값 유형은 힙에 할당되지 않으므로 이 유형의 인스턴스가 더 이상 활성화되지 않으면 해당 유형에 할당된 저장소가 해제되고 가비지 수집을 기다리지 않습니다

위 내용은 C#의 값 유형과 참조 유형 간의 차이점 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.