C\#에서 struct 와 class 의 차이 에 대한 상세 한 설명
쉽게 말 하면 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(List
→하지만 temp 의 지향 주 소 는 변 하지 않 았 습 니 다.
ChangeReference Type(List
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(List
→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 바이트 이하
●값 에 치 우 치고 간단 한 데이터 이지'대상 지향'에 치 우 치지 않 는 다.
●희망 치 는 변 하지 않 는 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.