Int é um tipo de referência ou um tipo de valor?

Eu sei que um int é um tipo de valor, mas o que são arrays de tipos de valor? Tipos de referência? Tipos de valor? Eu quero passar uma matriz para uma function para verificar alguma coisa. Devo apenas passar o array, pois ele apenas passará a referência dele, ou devo passá-lo como ref?

Arrays são mecanismos que permitem tratar vários itens como uma única coleção. O CLR (Common Language Runtime) do Microsoft® .NET oferece suporte a matrizes unidimensionais, matrizes multidimensionais e matrizes irregulares (matrizes de matrizes). Todos os tipos de matriz são implicitamente derivados de System.Array, que é derivado de System.Object. Isso significa que todas as matrizes são sempre tipos de referência que são alocados no heap gerenciado, e a variável do seu aplicativo contém uma referência à matriz e não à própria matriz.

https://msdn.microsoft.com/pt-br/library/bb985948.aspx

O teste mais simples para tipo de referência versus tipo de valor é que os tipos de referência podem ser null , mas os tipos de valor não podem.

Matrizes (mesmo de tipos de valor como int) são tipos de referência em C #.

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

Em C #, matrizes são realmente objects. System.Array é o tipo básico abstrato de todos os tipos de matriz.

Primeiro, quero dizer que o Array é um tipo de referência. Por quê? Eu explico um exemplo aqui.

Exemplo:

 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. 

Também os tipos de referência podem ser nulos, enquanto os tipos de valor não podem.

tipo de valor armazenado em Pilha e tipo de referência armazenado em Heap

Você pode passar array para funcionar usando out ou ref. Somente os methods de boot são diferentes.

Mais..

O array em si é um tipo de referência. Os valores dessa matriz são tipos de valor ou referência, conforme determinado pelo tipo de dados da matriz. No seu exemplo, a matriz é um tipo de referência e os valores são tipos de valor.

Todas as matrizes de dimensão única implementam implicitamente IList , onde é o tipo de dados da matriz. Você pode usar essa interface como o tipo de dados do seu parâmetro de método. Você também pode usar IEnumerable para o tipo de dados. Em ambos os casos (ou mesmo se você usar apenas int[] ), não precisará explicitamente passá-lo como um parâmetro ref .

Teste para verificar se é uma referência ou um tipo de valor:

 // 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! //************************** 

Você pode testá-lo online: https://dotnetfiddle.net/UWFP45

// A referência à matriz é passada por valor. Esta é a fonte da confusão 🙂 …

  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); } 

Matrizes sempre são tipos de referência.Não importa matriz deve conter tipo de valor como int ou tipo de referência como string.When você declara matriz, por exemplo

int[] integers=new int[10] ;

A variável integers contém apenas referências à matriz que residirá no heap.

Também há muitas pessoas mencionam que você pode diferir do tipo de valor do tipo de referência apenas depende do fato de que a variável pode ser nula ou não. Eu gostaria de mencionar que no c # atualmente os tipos de valor também podem ser nulos

por exemplo

 int? integer=null 

e não é boa maneira de identificar o tipo é referência ou valor apenas depende da variável fato poder ser nulo ou não.

Apenas um pouco de uma visão:

Por exemplo, int representa um único inteiro, int[] representa uma matriz de inteiros.

Para inicializar o array com dimensões específicas, você pode usar a new palavra-chave, dando o tamanho nos colchetes após o nome do tipo:

 //create a new array of 32 ints. int[] integers = new int[32]; 

Todos os arrays são tipos de referência e seguem a semântica de referência. Portanto, nesse código, mesmo que os elementos individuais sejam tipos de valor primitivos, a matriz de integers é um tipo de referência. Então, se você escrever mais tarde:

 int[] copy = integers; 

isso simplesmente designará a cópia inteira da variável para se referir à mesma matriz, não criará uma nova matriz.

A syntax de matriz do C # é flexível, permite que você declare matrizes sem inicializá-las, de modo que o array possa ser dinamicamente dimensionado posteriormente no programa. Com essa técnica, você está basicamente criando uma referência nula e, posteriormente, apontando essa referência em um trecho dinamicamente alocado de localizações de memory solicitadas com uma new palavra-chave:

 int[] integers; integers = new int[32]; 

Obrigado.