int가 값 유형이라는 것을 알고 있지만 값 유형의 배열은 무엇입니까? 참조 유형? 가치 유형? 뭔가를 확인하기 위해 배열을 함수에 전달하고 싶습니다. 배열의 참조를 전달하기 때문에 배열을 전달해야합니까, 아니면 참조로 전달해야합니까?
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);
}
배열은 항상 참조 유형입니다. 배열에 int와 같은 값 유형 또는 문자열과 같은 참조 유형이 포함되는 것은 중요하지 않습니다.
int[] integers=new int[10];
정수 변수 자체에는 힙에 상주 할 배열에 대한 참조 만 포함됩니다.
또한 많은 사람들이 변수가 null인지 아닌지에 따라 참조 유형과 값 유형을 다를 수 있다고 언급합니다. C #에서 현재 값 유형도 null이 될 수 있음을 언급하고 싶습니다.
예를 들어
int? integer=null
유형이 참조인지 또는 값이 사실 변수에만 의존하는지 확인하는 좋은 방법이 아닙니다.
약간의 통찰력 :
예를 들어, int단일 정수를 int[]나타내고 정수 배열을 나타냅니다.
특정 차원으로 배열을 초기화하려면 new키워드를 사용 하여 유형 이름 뒤의 대괄호 안에 크기를 제공 할 수 있습니다 .
//create a new array of 32 ints.
int[] integers = new int[32];
모든 배열은 참조 유형이며 참조 의미 체계를 따릅니다. 따라서이 코드에서 개별 요소는 기본 값 유형이지만 integers배열은 참조 유형입니다. 따라서 나중에 작성하면 :
int[] copy = integers;
이것은 단순히 동일한 배열을 참조하기 위해 전체 변수 사본을 할당하고 새 배열을 생성하지 않습니다.
C #의 배열 구문은 유연하므로 나중에 프로그램에서 배열의 크기를 동적으로 조정할 수 있도록 초기화하지 않고도 배열을 선언 할 수 있습니다. 이 기술을 사용하면 기본적으로 null 참조를 만들고 나중에 new키워드로 요청 된 동적 할당 메모리 위치에서 해당 참조를 가리 킵니다 .
int[] integers;
integers = new int[32];
감사합니다.