int가 값 유형이라는 것을 알고 있지만 값 유형의 배열은 무엇입니까? 참조 유형? 가치 유형? 뭔가를 확인하기 위해 배열을 함수에 전달하고 싶습니다. 배열의 참조를 전달하기 때문에 배열을 전달해야합니까, 아니면 참조로 전달해야합니까?
답변
배열은 여러 항목을 단일 컬렉션으로 처리 할 수있는 메커니즘입니다. Microsoft® .NET 공용 언어 런타임 (CLR)은 1 차원 배열, 다차원 배열 및 가변 배열 (배열 배열)을 지원합니다. 모든 배열 형식은 System.Object에서 파생 된 System.Array에서 암시 적으로 파생됩니다. 즉,
모든 배열은 항상
관리되는 힙에 할당되는 참조 유형 이며 앱의 변수에는 배열 자체가 아니라 배열에 대한 참조가 포함됩니다.
답변
참조 유형 대 값 유형에 대한 가장 간단한 테스트는 참조 유형은 일 수 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);
}
