수색…


비고

일반적으로 struct 는 성능이 매우 중요한 경우에만 사용됩니다. 값 유형은 스택에 있기 때문에 클래스보다 훨씬 빠르게 액세스 할 수 있습니다. 그러나 스택에는 힙보다 훨씬 적은 공간이 있으므로 구조체는 작게 유지해야합니다 (Microsoft는 struct 가 16 바이트를 넘지 않도록 권장합니다).

class 는 C #에서 가장 많이 사용되는 유형 (이 세 가지 유형)이며 일반적으로 먼저 사용해야하는 유형입니다.

enum 은 컴파일 타임에 한 번만 정의해야하는 항목의 명확한 정의 목록을 가질 때마다 사용됩니다. 열거 형은 일부 값에 대한 간단한 참조로 프로그래머에게 유용합니다. 비교할 constant 변수 목록을 정의하는 대신 열거 형을 사용하고 Intellisense 지원을 통해 실수로 잘못된 값을 사용하지 않도록 할 수 있습니다.

구조체 정의

Structs는 System.ValueType에서 상속되며 값 유형이며 스택에 있습니다. 값 형식이 매개 변수로 전달되면 값 형식으로 전달됩니다.

Struct MyStruct
{
    public int x;
    public int y;
}

값이 전달 되면 메서드의 매개 변수 값이 메서드에 복사 되고 메서드의 매개 변수에 대한 변경 내용은 메서드 외부에 반영되지 않습니다. 예를 들어 AddNumbers 라는 메서드를 호출하고 Value 유형 인 int 유형의 변수 ab 전달하는 다음 코드를 살펴 보겠습니다.

int a = 5;
int b = 6;

AddNumbers(a,b);

public AddNumbers(int x, int y)
{
    int z = x + y; // z becomes 11
    x = x + 5; // now we changed x to be 10
    z = x + y; // now z becomes 16
} 

우리가 5를 추가하더라도 x 방법 내부의 값 a 이 값 형식이기 때문에, 그대로 유지하고, 그 의미 x 사본이었다 의 값하지만 실제로 a a .

값 유형은 스택에 저장되며 값으로 전달됩니다.

클래스 정의

클래스는 System.Object에서 상속되며 참조 유형이며 힙에 살고 있습니다. 참조 유형이 매개 변수로 전달되면 참조로 전달됩니다.

public Class MyClass
{
    public int a;
    public int b;
}

참조로 전달 매개 변수에 대한 참조가 메소드에 전달되고, 상기 기준 메모리에 동일한 객체 때문에 파라미터의 변경이 외측이 반환 방법의 반영된다는 것을 의미한다. 이전과 같은 예제를 사용하겠습니다.하지만 int 클래스를 먼저 "래핑"합니다.

MyClass instanceOfMyClass = new MyClass();
instanceOfMyClass.a = 5;
instanceOfMyClass.b = 6;

AddNumbers(instanceOfMyClass);

public AddNumbers(MyClass sample)
{
    int z = sample.a + sample.b; // z becomes 11
    sample.a = sample.a + 5; // now we changed a to be 10
    z = sample.a + sample.b; // now z becomes 16
} 

이번에는 sample.a10 변경했을 때 참조전달 되었기 때문에 instanceOfMyClass.a 의 값 변경 됩니다 . 참조로 전달되는 것은 개체에 대한 참조 ( 포인터 라고도 함)가 개체 자체의 복사본 대신 메서드에 전달되었음을 의미합니다.

참조 유형은 힙에 저장되며 참조로 전달됩니다.

Enum 정의

열거 형은 특별한 유형의 클래스입니다. enum 키워드는이 클래스가 추상 System.Enum 클래스에서 상속 받았다는 것을 컴파일러에 알립니다. 열거 형은 항목의 고유 목록에 사용됩니다.

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

열거 형은 상수를 기본 값에 매핑하는 편리한 방법이라고 생각할 수 있습니다. 위에 정의 된 enum은 각 요일의 값을 선언하고 1 부터 시작합니다. Tuesday 은 자동으로 2 , Wednesday 3 등으로 매핑됩니다.

기본적으로 enum은 int 를 기본 유형으로 사용하고 0에서 시작하지만 byte, sbyte, short, ushort, int, uint, long, or ulong 과 같은 정수 유형을 사용할 수 있으며 모든 유형에 대해 명시적인 값을 지정할 수 있습니다. 목. 일부 항목이 명시 적으로 지정되었지만 일부 항목이 명시 적으로 지정되지 않은 경우, 마지막으로 정의 된 항목 이후의 각 항목은 1 씩 증가합니다.

이 예제는 MyEnum에 다른 값을 캐스팅 하여 사용합니다.

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

더 유용한 또 하나의 복잡한 enum 유형이 Flags 입니다. 에 열거 장식으로 Flags 속성을 한 번에 변수 하나 개 이상의 값을 할당 할 수 있습니다. 이 작업을 수행 할 때는 기수 2 표현으로 명시 적으로 값을 정의 해야합니다 .

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

이제 비트 비교 를 사용하거나 .NET 4.0 이상을 사용하는 경우 기본 제공 Enum.HasFlag 메서드를 사용하여 한 번에 둘 이상의 값을 비교할 수 있습니다.

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

Enum 클래스는 System.ValueType 에서 서브 클래 싱되므로 값 유형으로 취급되며 참조가 아닌 값으로 전달됩니다. 기본 개체는 힙에 만들어 지지만 enum 값을 함수 호출에 전달하면 Enum (일반적으로 System.Int32)의 기본 값 형식을 사용하는 값의 복사본이 스택에 푸시됩니다. 컴파일러는이 값과 스택에서 작성된 기본 객체 간의 연결을 추적합니다. 자세한 내용은 ValueType 클래스 (시스템) (MSDN) 를 참조하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow