>  기사  >  백엔드 개발  >  C#의 값 유형 및 참조 유형에 대한 자세한 소개

C#의 값 유형 및 참조 유형에 대한 자세한 소개

黄舟
黄舟원래의
2017-10-01 07:24:471232검색

이 글에서는 주로 C#의 값 유형과 참조 유형에 대한 관련 정보를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

C#에서는 값 유형과 참조 유형의 두 가지 개념이 매우 중요합니다. 유형을 디자인할 때 유형 인스턴스의 동작을 결정해야 합니다. 코드를 작성할 때 참조 유형과 값 유형의 차이점을 이해하지 못하면 코드에 불필요한 예외가 발생하게 됩니다. 많은 사람들이 이 두 가지 개념을 이해하지 못하기 때문에 프로그래밍 과정에서 많은 문제에 직면합니다. 여기서 블로거는 값 유형과 참조 유형에 대한 이해를 간략하게 설명합니다.

우선, 개념적으로 값 유형은 값을 직접 저장하는 반면 참조 유형은 값에 대한 참조를 저장합니다. 따라서 두 가지 유형은 메모리의 서로 다른 위치에 저장됩니다.

둘째, 메모리 공간의 관점에서 볼 때 값 유형은 스택에서 작동하는 반면 참조 유형은 힙에 저장 단위를 할당합니다.

스택은 컴파일 중에 메모리 공간이 할당되며, 힙은 프로그램 실행 중에 동적으로 할당되는 메모리 공간입니다. 프로그램의 실행 상태에 따라 메모리 크기가 동적으로 할당될 수 있습니다. . 따라서 값 유형은 항상 메모리에서 미리 정의된 바이트 수를 차지합니다. 참조 유형 변수는 스택에 메모리 공간을 할당합니다. 이 메모리 공간에는 다른 메모리 위치에 대한 참조가 포함됩니다. 이 위치는 변수의 실제 값이 저장되는 관리되는 힙의 주소입니다.

즉, 가치형은 현금과 동일하게 사용하고 싶으시면 바로 사용하시고, 인덱스형은 통장으로 사용하셔야 합니다. 은행에서 먼저 받아보세요.

그러나 값 유형은 스택에 메모리를 할당하는 반면 참조 유형은 관리되는 힙에 메모리를 할당합니다. 이는 일반적인 설명일 뿐입니다. 이에 대해서는 아래에서 자세히 설명합니다.

(1) 값 유형의 인스턴스의 경우 메소드에서 지역 변수로 사용되면 스레드 스택에 생성되고 인스턴스가 유형의 멤버로 사용되면 스레드 스택에 저장됩니다. 유형 멤버의 일부로 다른 유형 필드와 함께 관리되는 힙입니다.

모든 값 유형에는 해당 유형의 기본값을 초기화하는 암시적 기본 생성자가 있습니다. 예:


int i = new int();

는 다음과 같습니다.


Int32 i = new Int32();

은 다음과 같습니다.


int i = 0;

은 다음과 같습니다.


Int32 i = 0;

type이 호출될 것입니다. 함수를 구성하고 변수에 기본값을 할당합니다. 위의 예에서 기본 생성자는 i에 값 0을 할당합니다.

참고: C#의 모든 값 유형은 System.ValueType에서 암시적으로 파생되고 System.ValueType은 System.Object에서 직접 파생됩니다. 즉, System.ValueType 자체는 값 유형이 아니라 클래스 유형입니다. 핵심은 ValueType이 Equals 메서드를 재정의하여 참조 주소 대신 인스턴스 값에 따라 값 형식을 비교한다는 것입니다.

(2) 참조 유형의 인스턴스는 관리되는 힙에 생성됩니다.

다음은 값 유형과 참조 유형의 차이점을 자세히 설명하기 위한 코드입니다


namespace Test 
  { 
      class Program 
      { 
        static void Main(string[] args) 
        { 
       //调用ReferenceAndValue类中的Demonstration方法 
          ReferenceAndValue.Demonstration(); 
          Console.ReadLine(); 
        } 
      } 
      public class stamp       //定义一个类 
      { 
        public string Name { get; set; }    //定义引用类型 
        public int Age { get; set; }    //定义值类型 
      } 
      public static class ReferenceAndValue   //定义一个静态类 
      { 
        public static void Demonstration()   //定义一个静态方法 
        { 
          stamp Stamp_1 = new stamp { Name = "Premiere", Age = 25 }; //实例化 
          stamp Stamp_2 = new stamp { Name = "Again", Age = 47 }; //实例化 
          int age = Stamp_1.Age;     //获取值类型Age的值 
          Stamp_1.Age = 22;     //修改值类型的值 
          stamp guru = Stamp_2;     //获取Stamp_2中的值 
          Stamp_2.Name = "Again Amend";   //修改引用的Name值 
          Console.WriteLine("Stamp_1's age:{0}", Stamp_1.Age); //显示Stamp_1中的Age值 
          Console.WriteLine("age's value:{0}", age); //显示age值 
          Console.WriteLine("Stamp_2's name:{0}", Stamp_2.Name); //显示Stamp_2中的Name值 
          Console.WriteLine("guru's name:{0}", guru.Name); //显示guru中的Name值 
        } 
    } 
  }

위 프로그램을 실행하면 Stamp_1.Age의 값이 변경될 때 age가 변경되지 않는 것을 알 수 있습니다. 그에 따라 변경하십시오. 그러나 anders.Name의 값을 변경한 후에는 guru.Name이 그에 따라 변경되었습니다. 이것이 값 유형과 참조 유형의 차이입니다. age 값 유형 변수를 선언할 때 Stamp_1.Age 값을 할당합니다. 이때 컴파일러는 스택에 공간을 할당한 후 Stamp_1.Age 값을 채웁니다. Stamp_1.Age의 값이 age에 복사된다는 점만 빼면 컴퓨터에서 파일을 복사하는 것과 동일합니다. 참조 유형은 다릅니다. Guru를 선언하면 Stamp_2가 할당됩니다. 앞서 언급한 것처럼 참조 유형에는 힙의 데이터 영역에 대한 참조만 포함됩니다. 실제로 Stamp_2의 참조도 Guru에 할당됩니다. , 그래서 그들은 동일한 메모리 영역을 가리킵니다. 동일한 영역을 가리키기 때문에 누가 수정해도 그에 따라 상대방의 가치가 달라지게 됩니다. 또한 변할 것이다.

위 내용은 C#의 값 유형 및 참조 유형에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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