C\#의 값 형식 과 인용 유형 에 대해 간단히 말 하 다

기본 개념
C\#두 가지 데이터 형식 만 있 습 니 다:값 형식 과 참조 형식
값 형식 온라인 스 택 할당 공간,참조 형식 은 위탁 관리 더미 에서 공간 을 분배 합 니 다.
값 형식 을 인용 형식 으로 바 꾸 는 것 을 포장 이 라 고 하고 인용 유형 을 값 형식 으로 바 꾸 는 것 을 뜯 는 것 이 라 고 합 니 다.
다음은 값 유형 과 인용 유형 대조 표 입 니 다.

위의 그림 에서 쉽게 알 수 있 듯 이 string,Object,배열,class 는 인용 유형,간단 한 유형,매 거 진,구 조 는 값 유형 이다.
코드 전시
클래스 와 구조 호출 할당 을 정의 합 니 다.

메모리 할당 상황 은 다음 그림 과 같 습 니 다:

이 그림 에서 볼 수 있 듯 이 클 라 스 가 실례 화 된 대상 은 메모리 더미 에서 분 배 된 공간 을 가리킨다.truct 실례 화 된 대상 은 메모리 창고 에서 분 배 됩 니 다.
수정 코드 는 다음 과 같 습 니 다:

메모리 할당 상황:

위의 그림 에서 알 수 있 듯 이:

object obj=”abc”;
string i=(string)obj;
값 형식 과 참조 형식 저장 위치 가 다 릅 니 다.
인용 형식 이 라면 두 대상 이 같은 곳 을 가리 키 고 하 나 를 수정 할 때 다른 대상 의 값 이 달라 집 니 다.

using System;

namespace ConsoleApplication2
{
  //    (  ‘class')
  public class SomeRef
  {
    public int x { get; set; }
  }
  //   (  ‘struct')
  public struct SomeVal
  {
    public int x{ get; set; }
  }

  class Program
  {
    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;    //r1.x r2.x    
      v1.x = 8;    //v1.x   ,v2.x  

      Console.WriteLine(r1.x); //  8 
      Console.WriteLine(r2.x); //  8 
      Console.WriteLine(v1.x); //  8
      Console.WriteLine(v2.x); //  5

      Console.ReadKey();
    }
  }
}
3.값 유형 포장,분해
1.포장:인용 형식의 인 스 턴 스 에 값 형식의 데 이 터 를 포장 하 는 것 입 니 다(예 를 들 어 string 형식의 값 abc 를 object 대상 obj 에 부여 하 는 것)
String i=”abc”; 
object obj=(object)i;
포장 할 때 발생 하 는 일:
1),위탁 관리 더미 에 메모 리 를 분배 합 니 다.분 배 된 메모리 양 은 값 형식 필드 에 필요 한 메모리 양 이 며,모든 대상 에 게 있 는 두 개의 추가 구성원(유형 대상 포인터 와 동기 블록 색인)에 필요 한 메모리 양 입 니 다.
2)값 형식의 필드 를 새로 분 배 된 메모리 로 복사 합 니 다.
3)대상 주 소 를 되 돌려 줍 니 다.현재 이 주 소 는 대상 참조 입 니 다.값 형식 이 참조 형식 이 되 었 습 니 다.
2.뜯 기:인용 데이터 에서 값 형식 을 추출 하 는 것 입 니 다(예 를 들 어 object 대상 obj 의 값 을 string 형식의 변수 i 에 부여 하 는 것)
object obj=”abc”; 
string i=(string)obj;
상 자 를 뜯 는 것 은 포장 과정 이 거꾸로 되 는 것 이 아니 라 상 자 를 뜯 는 대가 가 포장 하 는 것 보다 훨씬 낮 습 니 다.상 자 를 뜯 는 것 은 지침 을 얻 는 과정 입 니 다.이 지침 은 한 대상 에 포 함 된 원시 값 유형 을 가리 키 고 있 습 니 다.
상 자 를 뜯 은 후 쌓 인 필드 에 포 함 된 값 을 스 택 의 값 형식 인 스 턴 스 로 복사 합 니 다.
3.값 형식 이 인용 형식 으로 바 뀌 었 을 때 반드시 포장 해 야 하 는 것 은 아 닙 니 다.예 를 들 어:
string str = "joye.net" + 26; //   26   string  
string str1 = "joye.net" + 26.ToString(); //tostring
관심 있 는 건 IL 로 봐 도 돼 요.

좋은 웹페이지 즐겨찾기