[C#] int []가 참조 유형입니까 아니면 값 유형입니까?

int가 값 유형이라는 것을 알고 있지만 값 유형의 배열은 무엇입니까? 참조 유형? 가치 유형? 뭔가를 확인하기 위해 배열을 함수에 전달하고 싶습니다. 배열의 참조를 전달하기 때문에 배열을 전달해야합니까, 아니면 참조로 전달해야합니까?



답변

배열은 여러 항목을 단일 컬렉션으로 처리 할 수있는 메커니즘입니다. Microsoft® .NET 공용 언어 런타임 (CLR)은 1 차원 배열, 다차원 배열 및 가변 배열 (배열 배열)을 지원합니다. 모든 배열 형식은 System.Object에서 파생 된 System.Array에서 암시 적으로 파생됩니다. 즉,
모든 배열은 항상
관리되는 힙에 할당되는 참조 유형 이며 앱의 변수에는 배열 자체가 아니라 배열에 대한 참조가 포함됩니다.

https://msdn.microsoft.com/en-us/library/bb985948.aspx


답변

참조 유형 대 값 유형에 대한 가장 간단한 테스트는 참조 유형은 일 수 null있지만 값 유형은 할 수 없다는 것입니다.


답변

배열 (int와 같은 값 유형 포함)은 C #의 참조 유형입니다.

http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx :

C #에서 배열은 실제로 개체입니다. System.Array는 모든 배열 유형의 추상 기본 유형입니다.


답변

먼저 Array가 참조 유형이라는 것을 말씀 드리고 싶습니다. 왜? 여기에 한 가지 예를 던져 설명하겠습니다.

예:

int val = 0; // this is a value type ok
int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap.

또한 참조 유형은 null 일 수 있지만 값 유형은 할 수 없습니다.

스택에 저장된 값 유형과 힙에 저장된 참조 유형

out 또는 ref를 사용하여 배열을 함수에 전달할 수 있습니다. 초기화 방법 만 다릅니다.

더..


답변

참조 또는 값 유형인지 테스트하여 확인합니다.

// we create a simple array of int
var a1 = new int[]{1,2,3};
// copy the array a1 to a2
var a2 = a1;
// modify the first element of a1
a1[0]=2;
// output the first element of a1 and a2
Console.WriteLine("a1:"+a1[0]); // 2
Console.WriteLine("a2:"+a2[0]); // 2
//**************************
// all the two variable point to the same array
// it's reference type!
//**************************

온라인으로 테스트 할 수 있습니다 : https://dotnetfiddle.net/UWFP45


답변

배열 자체는 참조 유형입니다. 해당 배열의 값은 배열 데이터 유형에 따라 결정되는 값 또는 참조 유형입니다. 귀하의 예에서 배열은 참조 유형이고 값은 값 유형입니다.

모든 단일 차원 배열은 암시 적으로 구현하는 IList<T>경우, <T>배열의 데이터 형식입니다. 대신 해당 인터페이스를 메소드 매개 변수의 데이터 유형으로 사용할 수 있습니다. IEnumerable<T>데이터 유형 에도 사용할 수 있습니다 . 두 경우 모두 (또는을 사용하더라도 int[]) 명시 적으로 ref매개 변수 로 전달할 필요가 없습니다 .


답변

// 배열에 대한 참조는 값으로 전달됩니다. 이것이 혼란의 원인입니다 🙂 …

        int[] test = { 1, 2, 3, 4 };

        modifContenuSansRef(test);
        Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié

        modifTailleSansRef(test);
        Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée

    }

    static void modifContenuSansRef(int[] t)
    {
        t[0] = 99;
    }

    static void modifTailleSansRef(int[] t)
    {
        Array.Resize(ref t, 8);
    }