[CLR via C#]5.2 참조 유형 및 값 유형

5349 단어 참조 유형
CLR은 참조 유형과 값 유형의 두 가지 유형을 지원합니다.
FCL 중 대다수가 참조 유형이지만 개발자가 가장 많이 사용하는 것은 역시 값 유형이다.인용 형식은 항상 트랜잭션 더미에 분배되며, C#의 new 조작부호는 대상의 메모리 주소, 즉 대상 데이터를 가리키는 메모리 주소를 되돌려줍니다.
참조 유형을 사용하려면 몇 가지 성능 문제에 주의해야 하며 먼저 사실을 고려해야 한다.
1) 메모리는 위탁 관리 더미에서 분배해야 한다.
2) 상단에 할당된 각 대상에 대해 일부 추가 구성원(예를 들어 앞에서 언급한 바와 같이)
유형 객체 포인터 "및"
블록 인덱스 동기화") - 이러한 구성원을 초기화해야 합니다.
3) 객체의 다른 바이트(필드에 설정)는 항상 0으로 설정됩니다.
4) 위탁 관리 더미에서 대상을 분배할 때 쓰레기 회수 작업을 강제로 수행할 수 있다.
만약 모든 유형이 인용 유형이라면 응용 프로그램의 성능이 현저히 떨어질 것이다.CLR은 단순하고 일반적인 유형의 성능을 향상시키기 위해 값 유형이라는 경량 유형을 제공합니다.
값 형식의 실례는 일반적으로 온라인 스택에서 분배됩니다. (인용 형식의 대상에 필드로 삽입할 수도 있지만.)값 유형을 나타내는 인스턴스의 변수에는 인스턴스를 가리키는 포인터가 포함되지 않습니다.반대로 변수에는 실례 자체의 필드가 포함되어 있다.
변수는 이미 실례의 필드를 포함하기 때문에 실례의 필드를 조작하기 위해 바늘을 제공할 필요가 없습니다.값 유형의 실례는 쓰레기 수거기의 제어를 받지 않습니다.따라서 값 유형의 사용은 트랜지스터 더미의 압력을 완화시키고 한 응용 프로그램이 생존 기간 동안 필요로 하는 쓰레기 회수 횟수를 감소시켰다.
  .NET Framework SDK 문서에는 유형을 볼 때 클래스라고 하는 모든 유형이 참조 유형임을 명시되어 있습니다.System과 같습니다.Exception 클래스, System.Random 클래스와 같은 참조 유형입니다.문서는 모든 값 유형을 구조 또는 열거로 만듭니다.System과 같습니다.Int32 Fabric, System.Boolean 구조 등가 유형입니다.
모든 값 유형은 System에서 선택해야 합니다.ValueType이 파생됩니다.모든 열거 유형은 System에서Enum 추상 클래스가 파생된 반면 System.Enum은
System.ValueType에서 파생된 것입니다.CLR과 모든 프로그래밍 언어는 매거에 특별한 대우를 해주고 나중에 언급할 것이다.
모든 값 형식은 은밀하게 밀봉된 (sealed) 이며, 하나의 값 형식을 다른 인용 형식이나 값 형식의 기본 형식에 사용하는 것을 방지하기 위해서입니다.
트랜잭션 코드에서 유형을 정의하는 개발자가 어느 곳에서 유형을 분배할지 결정하는 실례는 이 유형을 사용하는 사람은 통제권이 없다.
참조 유형과 값 유형의 차이점은 다음과 같습니다.
// 
class SomeRef 
{ 
    public Int32 x; 
} 
// 
struct SomeVal 
{ 
    public Int32 x; 
} 
 
static void Main(string[] args) 
{ 
    SomeRef r1 = new SomeRef();     // 
    SomeVal v1 = new SomeVal();     // 
    r1.x = 5; 
    v1.x = 5; 
    Console.WriteLine(r1.x);                //5 
    Console.WriteLine(v1.x);                //5 
 
    SomeRef r2 = r1; 
    SomeVal v2 = v1; 
    r1.x = 8; 
    v1.x = 9; 
    Console.WriteLine(r1.x);                //8 
    Console.WriteLine(r2.x);                //8 
    Console.WriteLine(v1.x);                //9 
    Console.WriteLine(v2.x);                //5 
} 

다음 조건이 충족되지 않는 한 유형을 값 유형으로 선언해서는 안 됩니다.
1) 유형에 기원 유형이 있는 행위
2) 타입은 다른 타입에서 상속할 필요가 없음
3) 타입도 다른 타입으로 파생되지 않는다.    
유형 실례의 크기는 고려열에 있어야 한다. 기본적으로 실참은 값을 전달하는 방식으로 전달되기 때문에 값 유형 실례의 필드를 복제하여 성능에 영향을 줄 수 있다.마찬가지로, 하나의 값 유형을 되돌려주는 방법으로 정의된 방법은 되돌릴 때, 실례의 필드는 호출자가 분배한 메모리에 값을 부여하여 성능에 영향을 미친다.
따라서 다음과 같은 값 유형을 선택해야 합니다.
1) 유형의 인스턴스가 작음(약 16바이트 이하)
2) 유형의 실례는 비교적 크지만 방법의 실참으로 전달되지 않고 방법에서 되돌아오지 않는다.
값 유형의 주요 장점은 그들이 대상이 되지 않고 위탁 관리 더미에 분배되는 데 있다.
값 유형과 참조 유형의 차이점:
1) 값 유형의 대상은 두 가지 표시 형식이 있는데 그것이 바로 컨테이너 없음(unboxed)과 컨테이너 없음(boxed)이다.인용 형식은 항상 포장된 형식에 있습니다.
2) 값 유형은 System입니다.ValueType에서 파생된 것입니다.이 유형은 System과 함께 제공됩니다.Object에서 정의한 동일한 방법입니다.하지만 시스템.ValueType은 Equals 메서드와 GetHashCode 메서드를 재작성했습니다.이 기본 구현은 성능에 문제가 있기 때문에, 자신의 값 형식을 정의할 때, Equals와GetHashCode 방법을 다시 쓰고, 디스플레이 구현을 제공해야 합니다.
3) 값 유형의 모든 방법은 추상적일 수 없고 모든 방법은 스텔스 밀봉(sealed) 방법이다.
4) 인용 형식의 변수는 쌓인 대상의 주소를 포함한다.기본적으로 인용 형식의 변수를 만들 때,null로 초기화되어 인용 형식의 변수가 현재 유효한 대상을 가리키지 않음을 나타냅니다.반면 값 유형 초기화는 모든 구성원이 0으로 초기화됩니다.값 유형의 변수는 포인터가 아니므로 값 유형에 액세스할 때 NullReference Exception 예외가 발생하지 않습니다.CLR은 값 유형에 공백 ID를 추가할 수 있는 특수한 특성을 제공합니다.예를 들어 "int?"
5) 한 값 유형의 변수를 다른 값 유형의 변수에 부여하고 한 번에 한 필드씩 복사합니다.인용 형식을 다른 인용 형식에 부여할 때 메모리 주소만 복사합니다.
6) 포장된 값 유형이 더 이상 쌓여 있지 않기 때문에 이 유형의 실례를 정의한 방법이 더 이상 활성화되지 않으면 분배된 메모리가 방출된다.이것은 값 형식의 실례가 메모리를 회수할 때 Finalize 방법을 통해 알림을 받지 않는다는 것을 의미합니다.
 
 
 

좋은 웹페이지 즐겨찾기