predeterminado new metodo example espaƱol bytes arreglo array c# arrays default-constructor array-initialize

new - constructor predeterminado c#



InicializaciĆ³n de arrays con constructor por defecto (6)

Aquí hay otro de una sola línea que no requiere ningún método de extensión:

Sample[] array = Enumerable.Range(0, 100).Select(i => new Sample()).ToArray();

Otra buena opción es la sugerencia de Scott a la respuesta de Jon :

public static T[] Populate<T>(this T[] array) where T : new() { for (int i = 0; i < array.Length; i++) array[i] = new T(); return array; }

Así que puedes hacer:

Sample[] array = new Sample[100].Populate();

public class Sample { static int count = 0; public int abc; public Sample() { abc = ++Sample.count; } }

Quiero crear una matriz de la clase anterior y quiero que cada elemento de la matriz se inicialice invocando al constructor predeterminado, de modo que cada elemento pueda tener un abc diferente. Así que hice esto:

Sample[] samples = new Sample[100];

Pero esto no hace lo que creo que debería hacer. Parece que de esta manera no se llama al constructor por defecto. ¿Cómo invocar al constructor por defecto al crear una matriz?

También me gustaría saber qué hace la declaración anterior?


El problema es que al declarar esa matriz, nunca asignó espacio para cada objeto. Simplemente asignó espacio para 100 objetos de tipo Muestra. Tendrás que llamar al constructor en cada uno.

Elaborar:

Food[] foods = Food[100]; for (int k = 0; k < foods.length; k++) { foods[k] = new Food(); }

Un trabajo interesante alrededor podría ser una función de fábrica. Considere adjuntar esto a su clase de muestra.

public static Sample[] getInstances(int aNumber) { Sample[] sample = Sample[aNumber]; for (int k = 0; k < sample.length; k++) { sample[k] = new Sample(); } return sample; }

Oculta el defecto, un poco, siempre que esta sea una función útil para usted.


En este punto, tiene una matriz vacía de tamaño 100, si desea llenarlo con elementos, entonces tendría que hacer algo como:

for(int i=0; i<samples.Length; i++) { samples[i] = new Sample(); }


No hay manera de hacer esto automáticamente; La inicialización de la matriz es esencialmente "borrar este bloque de memoria a 0s". Tendrías que hacer algo como:

var arr = new SomeType[size]; for(int i = 0 ; i < size ; i++) arr[i] = new SomeType();


Su código crea solo la matriz , pero ninguno de sus elementos. Básicamente, necesita almacenar instancias de Sample en esta matriz.

Para ponerlo simple, sin ningún tipo de LINQ, etc .:

Sample[] samples = new Sample[100]; for (int i = 0; i < samples.Length; i++) samples[i] = new Sample();

Tenga en cuenta que su solución no es segura para subprocesos.


Usted no puede, básicamente. Cuando crea una matriz, siempre se llena inicialmente con el valor predeterminado para el tipo, que para una clase siempre es una referencia nula. Para int es 0, para bool es falso, etc.

(Si usa un inicializador de matriz, eso creará la matriz "vacía" y luego la rellenará con los valores que ha especificado, por supuesto).

Hay varias formas de poblar la matriz llamando al constructor: probablemente solo usaría un bucle foreach. Usar LINQ con Enumerable.Range / Repeat se siente un poco forzado.

Por supuesto, siempre puede escribir su propio método de población, incluso como un método de extensión:

public static T[] Populate<T>(this T[] array, Func<T> provider) { for (int i = 0; i < array.Length; i++) { array[i] = provider(); } return array; }

Entonces podrías usar:

Sample[] samples = new Sample[100].Populate(() => new Sample());

Lo que me gusta de esta solución:

  • Todavía es una expresión única, que puede ser útil en varios escenarios
  • No introduce conceptos que realmente no desea (como repetir un solo valor o crear un rango)

Por supuesto usted podría agregar más opciones:

  • Una sobrecarga que toma un Func<int, T> lugar de un Func<T> , pasando el índice al proveedor
  • Un método sin extensión que crea la matriz y la llena.