수색…


비고

참조 유형을 선언 할 때 초기 값은 null 됩니다. 이는 아직 메모리에있는 위치를 가리 키지 않고 완벽하게 유효한 상태이기 때문입니다.
그러나 Nullable 형식을 제외하고 값 형식은 일반적으로 항상 값을 가져야합니다.

사용중인 값 유형

값 유형에는 단순히 값만 들어 있습니다.

모든 값 형식은 System.ValueType 클래스에서 파생되며 여기에는 대부분의 기본 제공 형식이 포함됩니다.

새 값 유형을 만들 때 스택 이라는 메모리 영역이 사용됩니다.
스택은 선언 된 유형의 크기만큼 적절하게 커집니다. 예를 들어 int는 항상 스택에 32 비트의 메모리가 할당됩니다. 값 유형이 더 이상 범위에 없으면 스택의 공간이 할당 해제됩니다.

아래 코드는 새 변수에 할당되는 값 유형을 보여줍니다. 구조체는 사용자 지정 값 형식을 만드는 편리한 방법으로 사용됩니다 (System.ValueType 클래스는 확장 할 수 없습니다).

이해해야 할 중요한 점은 값 유형을 할당 할 때 값 자체가 새 변수에 복사 된다는 것입니다. 즉, 서로 영향을 줄 수없는 두 개의 서로 다른 객체 인스턴스가 있음을 의미합니다.

struct PersonAsValueType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsValueType personA;

        personA.Name = "Bob";

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(                // Outputs 'False' - because 
            object.ReferenceEquals(       // personA and personB are referencing 
                personA,                  // different areas of memory
                personB));                

        Console.WriteLine(personA.Name);  // Outputs 'Linda'
        Console.WriteLine(personB.Name);  // Outputs 'Bob'
    }
}

사용중인 참조 유형

참조 유형은 메모리 영역에 대한 참조 와 해당 영역에 저장된 값으로 구성 됩니다.
이것은 C / C ++의 포인터와 유사합니다.

모든 참조 유형은 힙 (heap) 에 저장됩니다.
힙은 객체가 저장된 메모리의 관리 된 영역입니다. 새 객체가 인스턴스화되면 힙의 일부가 해당 객체에서 사용하도록 할당되고 해당 힙 위치에 대한 참조가 반환됩니다. 힙은 가비지 컬렉터에 의해 관리되고 관리되며 수동 개입을 허용하지 않습니다.

인스턴스 자체에 필요한 메모리 공간 외에도 .NET CLR에 필요한 추가 임시 정보와 함께 참조 자체를 저장하기위한 추가 공간이 필요합니다.

아래 코드는 새 변수에 할당되는 참조 유형을 보여줍니다. 이 예에서는 클래스를 사용하고 있으며 모든 클래스는 정적 인 경우에도 참조 유형입니다.

참조 유형이 다른 변수에 지정되면 값 자체가 아닌 복사 된 객체에 대한 참조 입니다. 이것은 값 유형과 참조 유형 간의 중요한 차이입니다.

이것이 의미하는 바는 동일한 객체에 대한 두 개의 참조가 있음을 의미합니다.
해당 객체 내의 값을 변경하면 두 변수 모두에 반영됩니다.

class PersonAsReferenceType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsReferenceType personA;

        personA = new PersonAsReferenceType { Name = "Bob" };

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(               // Outputs 'True' - because
            object.ReferenceEquals(      // personA and personB are referencing 
                personA,                 // the *same* memory location
                personB));

        Console.WriteLine(personA.Name); // Outputs 'Linda'
        Console.WriteLine(personB.Name); // Outputs 'Linda'
    }


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