C\#에서 struct 와 class 의 차이 에 대한 상세 한 설명

12116 단어 C#structclass
본 고 는 C\#에서 struct 와 class 의 차 이 를 상세 하 게 분 석 했 고 C\#초보 자 에 게 는 이해 하고 파악 할 필요 가 있다.
쉽게 말 하면 struct 는 값 형식 으로 struct 형식의 인 스 턴 스 를 만 들 고 스 택 에 분 배 됩 니 다.class 는 참조 형식 입 니 다.class 형식 인 스 턴 스 를 만 들 고 위탁 관리 더미 에 분 배 됩 니 다.그러나 struct 와 class 의 차 이 는 그리 간단 하지 않다.
요약 하면 struct 와 class 의 차이 점 은 다음 과 같다.
●클래스 는 인용 형식,struct 는 값 형식
●위탁 관리 더미 에 클래스 를 만 드 는 인 스 턴 스,스 택 에 struct 인 스 턴 스 를 만 듭 니 다.
●클래스 인 스 턴 스 의 할당,인용 주소,struct 인 스 턴 스 의 할당,할당 값
●클래스 는 매개 변수 유형 으로 전달 되 고 주 소 를 참조 하 며 struct 는 매개 변수 유형 으로 전달 되 며 값 을 전달 합 니 다.
●클래스 는 기본 무 참 구조 함수 가 없고 struct 는 기본 무 참 구조 함수 가 있 습 니 다.
●클래스 상속 지원,struct 상속 지원 하지 않 음
●클래스 는'대상 지향'에 치 우 치고 복잡 하고 대형 데이터 에 사용 되 며 struct 는'간단 한 값'에 치 우 친다.예 를 들 어 16 바이트 이하 이 고 구조 가 간단 하 다.
●클래스 의 구성원 은 초기 값 을 부여 하기 쉬 우 며,struct 유형의 구성원 에 게 초기 값 을 부여 하기 어렵다.
●클래스 의 인 스 턴 스 는 new SomeClast()를 통 해 만 들 수 있 습 니 다.struct 형식의 인 스 턴 스 는 new SomeStruct()를 통 해 만 들 수도 있 고 SomeStruct my Struct 를 통 해 만 들 수도 있 습 니 다.만 들 기
1.할당 의 측면 에서 struct 와 class 의 차 이 를 체험 합 니 다.
형식 할당 을 참조 하 는 것 은 주 소 를 변수 에 할당 하 는 것 입 니 다.

class Program
  {
    static void Main(string[] args)
    {
      SizeClass sizeClass = new SizeClass(){Width = 10, Length = 10};
      Console.WriteLine("   :width={0},length={1}", sizeClass.Width, sizeClass.Length);

      var copyOfSizeClass = sizeClass;
      copyOfSizeClass.Length = 5;
      copyOfSizeClass.Width = 5;
      Console.WriteLine("   :width={0},length={1}",sizeClass.Width, sizeClass.Length);
      Console.ReadKey();
    }
  }

  public class SizeClass
  {
    public int Width { get; set; }
    public int Length { get; set; }
  }

  public struct SizeStruct
  {
    public int Width { get; set; }
    public int Length { get; set; }
  }

실행 결 과 는 다음 그림 과 같 습 니 다.

이상,sizeClass 를 copyOfSize 변수 에 할당 할 때,sizeClass 가 가리 키 는 주 소 를 copyOfSize 변수 에 할당 하고,두 변 수 는 같은 주 소 를 동시에 가리킨다.따라서 copy OfSizeClass 변수의 값 을 바 꾸 면 size Class 의 값 을 바 꾸 는 것 과 같 습 니 다.
struct 형식 할당 은 완전히 복사 되 어 스 택 에 똑 같은 변 수 를 추가 하 였 습 니 다.

class Program
  {
    static void Main(string[] args)
    {
      SizeStruct sizeStruct = new SizeStruct(){Length = 10, Width = 10};
      Console.WriteLine("   :width={0},length={1}", sizeStruct.Width, sizeStruct.Length);

      var copyOfSizeStruct = sizeStruct;
      copyOfSizeStruct.Length = 5;
      copyOfSizeStruct.Width = 5;
      Console.WriteLine("   :width={0},length={1}", sizeStruct.Width, sizeStruct.Length);
      Console.ReadKey();
    }
  }

프로그램 실행 결 과 는 다음 그림 과 같 습 니 다.

이상,sizeStruct 를 copyOfSizeStruct 변수 에 할당 할 때 완전히 복사 되 며,copyOfSizeStruct 의 값 을 바 꾸 면 sizeStruct 에 영향 을 주지 않 습 니 다.
2.매개 변수 전송 값 측면 에서 struct 와 class 의 차 이 를 체험 합 니 다.
참조 형식 매개 변 수 는 주소 입 니 다.

class Program
  {
    static void Main(string[] args)
    {
      List<string> temp = new List<string>(){"my","god"};
      temp.ForEach(t => Console.Write(t + " "));
      Console.ReadKey();
    }

    public static void ChangeReferenceType(List<string> list)
    {
      list = new List<string>(){"hello", "world"};
    }
  }

실행 결과:my god
왜 hello world 가 아니 야?
→스 택 의 temp 은 위탁 관리 더미 의 집합 인 스 턴 스 를 가리킨다.
→temp 을 ChangeReference Type(temp)방법 에 넣 으 면 본질 적 으로 temp 가 가리 키 는 주 소 를 변수 list 에 할당 하 는 것 입 니 다.
→ChangeReference Type(Listlist)방법 내부 에서 변수 list 를 다른 집합 인 스 턴 스 주 소 를 가리 키 고 있 습 니 다.
→하지만 temp 의 지향 주 소 는 변 하지 않 았 습 니 다.
ChangeReference Type(Listlist)내부 구현 방식 을 바 꾸 겠 습 니 다.다른 것 은 변 하지 않 습 니 다.

class Program
  {
    static void Main(string[] args)
    {
      List<string> temp = new List<string>(){"my","god"};      
      ChangeReferenceType(temp);
      temp.ForEach(t => Console.Write(t + " "));
      Console.ReadKey();
    }

    public static void ChangeReferenceType(List<string> list)
    {
      list.Clear();
      list.Add("hello");
      list.Add("world");
    }
  }

실행 결과:hello world
왜 my god 가 아니 야? 
→스 택 의 temp 은 위탁 관리 더미 의 집합 인 스 턴 스 를 가리킨다.
→temp 을 ChangeReference Type(temp)방법 에 넣 으 면 본질 적 으로 temp 가 가리 키 는 주 소 를 변수 list 에 할당 하 는 것 입 니 다.
→ChangeReference Type(Listlist)방법 내부 에서 temp 와 list 가 공동으로 가리 키 는 인 스 턴 스 를 비우 고"hello"와"World"두 요 소 를 추가 합 니 다.
→list 와 temp 가 가리 키 는 인 스 턴 스 가 같 기 때문에 list 가 가리 키 는 인 스 턴 스 를 바 꾸 는 것 은 temp 가 가리 키 는 인 스 턴 스 를 바 꾸 는 것 과 같 습 니 다.
이상 은 유형 매개 변 수 를 인용 하여 주 소 를 전달 한 다 는 것 을 잘 설명 했다.
값 형식 struct 매개 변 수 는 값 을 전달 합 니 다.

class Program
  {
    static void Main(string[] args)
    {
      Size s = new Size(){Length = 10, Width = 10};
      ChangeStructType(s);
      Console.Write("Length={0},Width={1}", s.Length,s.Width);
      Console.ReadKey();
    }

    public static void ChangeStructType(Size size)
    {
      size.Length = 0;
      size.Width = 0;
    }
  }

  public struct Size
  {
    public int Length { get; set; }
    public int Width { get; set; }
  }

실행 결 과 는 다음 그림 과 같 습 니 다.

왜 Length 와 Width 는 0 이 아 닙 니까?
→스 택 에서 변수 size
→ChangeStructType(size)을 통 해 s 변 수 를 ChangeStructType(Size size)의 size 변수 에 할당 하면 본질 적 으로 스 택 에 변수 size 를 만 들 었 고 size 의 값 은 s 와 똑 같 습 니 다.
→ChangeStructType(Size size)내부 에서 size 의 값 을 변경 하 는 것 은 변수 s 와 무관 합 니 다.
3.struct 유형의 struct 유형 속성 과 struct 참조 유형 속성 체험 struct 와 class 의 차이
struct 가 있다 고 가정 하면 struct 형식의 속성 이 있 습 니 다.
다음은 struct 타 입 Room 은 struct 타 입의 속성 TableSize 와 Tvsize 가 있 습 니 다.저 희 는 Room 인 스 턴 스 를 통 해 struct 타 입의 속성 값 을 어떻게 수정 합 니까?

class Program
  {
    static void Main(string[] args)
    {
      Room r = new Room()
      {
        TableSize = new Size(){Length = 100, Width = 80},
        TvSize = new Size(){Length = 10, Width = 8}
      };

      r.TableSize.Length = 0;
      
      Console.WriteLine("table      :length={0},width={1}", r.TableSize.Length, r.TableSize.Width);
      Console.ReadKey();
    }
  }

  public struct Size
  {
    public int Length { get; set; }
    public int Width { get; set; }
  }

  public struct Room
  {
    public Size TableSize { get; set; }
    public Size TvSize { get; set; }
  }

이상,r.TableSize.Length=0;변수 가 아니 기 때문에 r.TableSize 의 값 을 수정 할 수 없습니다.확실히 r.TableSize 는 Size 의 복사 일 뿐 다른 변수 에 할당 되 지 않 았 기 때문에 r.TableSize 는 임시 적 이 고 자동 으로 회수 되 며 할당 에 도 의미 가 없습니다.
 r.TableSize 를 수정 하려 면

r.TableSize.Length = 0;
다음 과 같이 변경:

r.TableSize = new Size(){Length = 0, Width = 0};
실행 결 과 는 다음 그림 과 같 습 니 다.

이 를 통 해 알 수 있 듯 이 struct 형식의 struct 유형 속성 을 바 꾸 는 특정한 속성 은 통 하지 않 습 니 다.상기 r.TableSize 는 복사 일 뿐 임시 적 이 고 자동 으로 회수 되 기 때 문 입 니 다.struct 형식의 struct 형식 속성 을 바 꾸 려 면 위 와 같이 r.TableSize 에 완전한 Size 인 스 턴 스 를 부여 해 야 합 니 다.
struct 가 있다 고 가정 하면 인용 형식의 속성 이 있 습 니까?
다음은 struct 형식의 Room 은 인용 유형 속성,TableSize 와 Tvsize 가 있 습 니 다.어떻게 Room 인 스 턴 스 를 통 해 인용 유형의 속성 값 을 수정 합 니까?또한,우 리 는 클래스 Size 에서 하나의 사건 을 정 의 했 습 니 다.Size 의 속성 값 을 할당 할 때 이 벤트 를 촉발 하여 size 류 의 속성 값 이 바 뀌 었 음 을 알려 줍 니 다.

class Program
  {
    static void Main(string[] args)
    {
      var oneSize = new Size() {Length = 10, Width = 10};
      var twoSize = oneSize;

      oneSize.Changed += (s, e) => Console.Write("Size     ~~");
      oneSize.Length = 0;
      Console.ReadKey();
    }
  }

  public class Size
  {
    private int _length;
    private int _width;

    public event System.EventHandler Changed;

    public int Length
    {
      get { return _length; }
      set
      {
        _length = value;
        OnChanged();
      }
    }

    public int Width
    {
      get { return _width; }
      set { _width = value; OnChanged(); }
    }

    private void OnChanged()
    {
      if (Changed != null)
      {
        Changed(this, new EventArgs());
      }
    }
  }

  public struct Room
  {
    public Size TableSize { get; set; }
    public Size TvSize { get; set; }
  }

실행,표시:Size 가 변경 되 었 습 니 다~~
oneSize.Length 에 대한 수정 은 실제 적 으로 oneSize.Length 가 위탁 관리 더미 의 인 스 턴 스 를 가리 키 는 것 입 니 다.
4.구조 함수 에서 struct 와 class 의 차 이 를 체험 합 니 다.
struct 형식 은 암시 적 인 기본 무 참 구조 함 수 를 포함 합 니 다.

class Program
  {
    static void Main(string[] args)
    {
      var size = new SizeStruct();
      Console.WriteLine("length={0},width={1}", size.Length, size.Width);
      Console.ReadKey();
    }
  }

  public struct SizeStruct
  {
    public int Length { get; set; }
    public int Width { get; set; }
  }

실행 결 과 는 다음 그림 과 같 습 니 다.

왜 우 리 는 Size Struct 에 무 참 구조 함 수 를 정의 하지 않 았 고 잘못 보고 하지 않 았 습 니까?
--struct 형식 은 암시 적 인 무 참 구조 함수 가 있 고 모든 구성원 에 게 기본 값 을 부여 하기 때문에 int 형식 속성 구성원 의 기본 값 은 0 입 니 다.
클래스 는 암시 적 인 무 참 구조 함 수 를 포함 하지 않 습 니 다.

class Program
  {
    static void Main(string[] args)
    {
      var size = new SizeClass();
      Console.WriteLine("length={0},width={1}", size.Length, size.Width);
      Console.ReadKey();
    }
  }

  public class SizeClass
  {
    public int Length { get; set; }
    public int Width { get; set; }

    public SizeClass(int length, int width)
    {
      Length = length;
      Width = Width;
    }
  }

실행,오류 보고:SizeClass 는 0 개의 매개 변 수 를 포함 하지 않 는 구조 함수 입 니 다.
5.유형 구성원 에 게 초기 값 을 부여 하여 struct 와 class 의 차이 점 을 체험 합 니 다.
필드 에 직접 초기 값 을 부여 하면

public struct SizeStruct
  {
    public int _length = 10;
  }
실행,오류 보고:구조 에 인 스 턴 스 필드 초기 값 설정 항목 이 있 을 수 없습니다.
구조 함 수 를 통 해 필드 에 초기 값 을 부여 하면

public struct SizeStruct
  {
    public int _length;

    public SizeStruct()
    {
      _length = 10;
    }
  }

실행,오류 보고:구조 에 명시 적 매개 변수 없 는 구조 함 수 를 포함 할 수 없습니다.
이 를 통 해 알 수 있 듯 이 struct 형식 구성원 에 게 초기 값 을 부여 하 는 것 은 쉽 지 않 으 며,class 구성원 에 게 초기 값,no problem 을 부여 합 니 다.
struct 는 언제 사용 합 니까?class 는 언제 사용 합 니까?
대부분의 경우 class 류 를 사용 하 는 것 을 추천 합 니 다.클래스 의 할당,매개 변수 유형 으로 전달 되 든 되 돌아 오 는 인 스 턴 스 든 실제 복사 한 것 은 위탁 관리 더미 에 주 소 를 참조 하 는 것 이 고 약 4 개의 바이트 이기 때문에 성능 향상 에 도움 이 됩 니 다.
한편,struct 형식 으로서 값 을 부여 하 든 매개 변수 형식 으로 전달 하 든 struct 형식 인 스 턴 스 를 되 돌려 주 든 완전히 복사 하 든 스 택 의 공간 을 차지 합 니 다.Microsoft's Value Type Recommendations 에 따 르 면 다음 과 같은 경우 struct 를 추천 합 니 다.
●16 바이트 이하
●값 에 치 우 치고 간단 한 데이터 이지'대상 지향'에 치 우 치지 않 는 다.
●희망 치 는 변 하지 않 는 다

좋은 웹페이지 즐겨찾기