¿Cómo inicializo un array vacío en C#?


Es posible crear una matriz vacía sin especificar el tamaño?

Por ejemplo, creé:

String[] a = new String[5];

¿Podemos crear la matriz de cadenas anterior sin el tamaño?

Author: Peter Mortensen, 2012-01-04

12 answers

Si va a utilizar una colección que no conoce el tamaño de antemano, hay mejores opciones que los arrays.

Use un List<string> en su lugar - le permitirá agregar tantos elementos como necesite y si necesita devolver un array, llame a ToArray() en la variable.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

Si debe crear una matriz vacía, puede hacer esto:

string[] emptyStringArray = new string[0]; 
 333
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-27 10:47:42

Prueba esto:

string[] a= new string[] { };
 139
Author: hemant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-07 14:07:43

En. Net 4.6 la forma preferida es usar un nuevo método, Array.Empty:

String[] a = Array.Empty<string>();

La implementación es sucinta, usando cómo se comportan los miembros estáticos en las clases genéricas en. Net :

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(código código relacionado con el contrato eliminado para mayor claridad)

Véase también:

 64
Author: Kobi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:27

Podría inicializarlo con un tamaño de 0, pero tendrá que reiniciarlo, cuando sepa cuál es el tamaño, ya que no puede anexar al array.

string[] a = new string[0];
 28
Author: MatthiasG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 15:14:19

No tiene mucho sentido declarar un array sin tamaño. Un array tiene aproximadamente el tamaño. Cuando se declara una matriz de tamaño específico, se especifica el número fijo de ranuras disponibles en una colección que puede contener cosas y, en consecuencia, se asigna memoria. Para agregarle algo, necesitará reiniciar el array existente (incluso si está redimensionando el array, vea este hilo). Uno de los raros casos en los que querría inicializar una matriz vacía sería: pase array como argumento.

Si desea definir una colección cuando no sabe de qué tamaño podría ser posiblemente, array no es su elección, sino algo como un List<T> o similar.

Dicho esto, la única manera de declarar un array sin especificar tamaño es tener un array vacío de tamaño 0. hemant y Alex Dn proporciona dos maneras. Otra alternativa más simple es simplemente :

string[] a = { };

[Los elementos dentro del soporte debe ser implícitamente convertible a tipo definido, por ejemplo, string[] a = { "a", "b" };]

O aún otro:

var a = Enumerable.Empty<string>().ToArray();

Aquí hay una forma más declarativa :

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

Ahora puedes llamar:

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);
 6
Author: nawfal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:41

Puedes hacer:

string[] a = { String.Empty };

Nota: OP significaba no tener que especificar un tamaño, no hacer un array sizeless

 3
Author: vapcguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-12 11:29:17

Puede definir el tamaño del array en tiempo de ejecución .

Esto le permitirá hacer lo que sea para calcular dinámicamente el tamaño de la matriz. Pero, una vez definido el tamaño es inmutable.

Array a = Array.CreateInstance(typeof(string), 5);
 2
Author: radarbob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-04 14:29:20

Lo había intentado:

string[] sample = new string[0];

Pero solo pude insertar una cadena en ella, y luego obtuve un error exceptionOutOfBound, así que simplemente puse un tamaño para ella, como

string[] sample = new string[100];

U otra forma que funcione para mí:

List<string> sample = new List<string>();

Asignando valor para la lista:

sample.Add(your input);
 2
Author: Cs_Lu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-07 14:10:29

Como sé que no se puede hacer matriz sin tamaño, pero se puede utilizar

List<string> l = new List<string>() 

Y luego l.ToArray().

 1
Author: Alex Dn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-10 14:04:06

Simple y elegante!

string[] array = {}
 1
Author: disklosr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-25 14:08:50

Combinando las sugerencias de @nawfal y @Kobi:

namespace Extensions
{
    /// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
    public static class Array<T>
    {
        public static readonly T[] Empty = new T[0];
    }
}

Ejemplo de uso:

Array<string>.Empty

HTH

 0
Author: ShloEmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 06:00:51

Aquí hay un ejemplo del mundo real. En esto es necesario inicializar el array foundFiles primero a longitud cero.

(Como se enfatiza en otras respuestas: Esto no inicializa un elemento y especialmente no un elemento con índice cero porque eso significaría que la matriz tiene una longitud 1. La matriz tiene longitud cero después de esta línea!).

Si la parte = string[0] se omite, hay un error de compilador!

Esto se debe al bloque catch sin rethrow. El compilador de C# reconoce el código path, que la función Directory.GetFiles() puede lanzar una excepción, por lo que la matriz podría no inicializarse.

Antes de que alguien diga, no repensar la excepción sería un mal manejo de errores: Esto no es cierto. El manejo de errores tiene que ajustarse a los requisitos.

En este caso se asume que el programa debe continuar en caso de un directorio que no se puede leer, y no romper - el mejor ejemplo es una función que atraviesa una estructura de directorios. Aquí el manejo de errores es solo registrarlo. De por supuesto, esto podría hacerse mejor, por ejemplo, recopilando todos los directorios con llamadas fallidas GetFiles(Dir) en una lista, pero esto conducirá demasiado lejos aquí.

Es suficiente indicar que evitar throw es un escenario válido, por lo que la matriz debe inicializarse a una longitud cero. Sería suficiente hacer esto en el bloque catch, pero esto sería un mal estilo.

La llamada a GetFiles(Dir) redimensiona el array.

string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
    foundFiles = Directory.GetFiles(dir);  // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
  Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
  // throw; // This would throw Exception to caller and avoid compiler error
}

foreach (string filename in foundFiles)
    Console.WriteLine("Filename: " + filename);
 0
Author: Philm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-07 14:09:34