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 로 봐 도 돼 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C\#의 값 형식 과 인용 유형 에 대해 간단히 말 하 다1),위탁 관리 더미 에 메모 리 를 분배 합 니 다.분 배 된 메모리 양 은 값 형식 필드 에 필요 한 메모리 양 이 며,모든 대상 에 게 있 는 두 개의 추가 구성원(유형 대상 포인터 와 동기 블록 색인)에 필요...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.