¿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?
¿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?
Respuestas:
Si va a utilizar una colección que no conoce el tamaño de antemano, hay mejores opciones que las matrices.
Utilice en su List<string>
lugar: le permitirá agregar tantos elementos como necesite y, si necesita devolver una matriz, llame ToArray()
a 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];
string[]
que no tiene elementos. Si intentas acceder emptyStringArray[0]
, recibirás unIndexOutOfRangeException
Prueba esto:
string[] a = new string[] { };
int[] variable = new int[]{}
y lo usa, por ejemplo, en un bucle como foreach (var s in variable){ Console.WriteLine(s);}
el código se compila en: int[] args1 = new int[0];
y foreach (int num in args1){Console.WriteLine(num);}
. Por lo tanto, no debería haber diferencia entre usar new int[0]
y new int[]{}
ya que ambos se compilan en el mismo código.
var
, aunque solo para variables locales (no para campos). Sin embargo, en C # 2.0 (Visual Studio 2005) y versiones anteriores, tenía que usar la sintaxis de esta respuesta (o string[] a = new string[0];
).
En .NET 4.6, la forma preferida es utilizar un nuevo método Array.Empty
:
String[] a = Array.Empty<string>();
La implementación es sucinta, utilizando cómo se comportan los miembros estáticos en 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 relacionado con el código del contrato eliminado para mayor claridad)
Ver también:
Array.Empty
código fuente en Fuente de referenciaArray.Empty<T>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
no no crear una matriz. Devuelve una referencia a una matriz preasignada.
No tiene mucho sentido declarar una matriz sin tamaño. Una matriz tiene aproximadamente el tamaño . Cuando declara una matriz de tamaño específico, 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, deberá reiniciar la matriz existente de todos modos (incluso si está cambiando el tamaño de la matriz, vea este hilo ). Uno de los casos raros en los que desearía inicializar una matriz vacía sería pasar la matriz como argumento.
Si desea definir una colección cuando no sabe de qué tamaño podría ser, la matriz no es su elección, sino algo así como un List<T>
ao similar.
Dicho esto, la única forma de declarar una matriz sin especificar el tamaño es tener una matriz vacía de tamaño 0 . Hemant y Alex Dn ofrece dos formas. Otra alternativa más simple es simplemente :
string[] a = { };
[ Los elementos dentro del paréntesis deben ser implícitamente convertibles al 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);
Simple y elegante!
string[] array = {}
array
a justo a
, ya que array
es una palabra clave cuando se escribe con mayúscula. Es una mala práctica usar un nombre de palabra clave como nombre de variable, incluso si el caso es diferente. Y básicamente lo mismo que mi respuesta, excepto que tenía String.Empty
allí.
a
es malo?
string[] a = new string[0];
o notación corta:
string[] a = { };
La forma preferida ahora es:
var a = Array.Empty<string>();
He escrito una breve expresión regular que puede usar en Visual Studio si desea reemplazar las asignaciones de longitud cero, por ejemplo new string[0]
. Use Buscar (buscar) en Visual Studio con la opción Expresión regular activada:
new[ ][a-zA-Z0-9]+\[0\]
Ahora Buscar todo o F3 (Buscar siguiente) y reemplazar todo con Array.Empty <...> ()!
Puede definir el tamaño de la matriz 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);
int i = 5; string[] a = new string[i];
Había intentado:
string[] sample = new string[0];
Pero solo pude insertar una cadena en él, y luego recibí un error de excepciónOutOfBound, así que simplemente le puse un tamaño, como
string[] sample = new string[100];
O de otra manera que funcione para mí:
List<string> sample = new List<string>();
Asignación de valor para la lista:
sample.Add(your input);
Combinando 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
ACTUALIZACIÓN 2019-05-14
(créditos a @Jaider ty)
Mejor uso de .Net API:
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Se aplica a:
.NET Core: 3.0 Vista previa 5 2.2 2.1 2.0 1.1 1.0
.NET Framework: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET Standard: 2.1 Vista previa 2.0 1.6 1.5 1.4 1.3
...
HTH
arr = Array.Empty<string>();
Tu puedes hacer:
string[] a = { String.Empty };
Nota: OP significa no tener que especificar un tamaño, no hacer una matriz sin apresto
specify
un tamaño, no hacer una matriz sizeless
.
Aquí hay un ejemplo del mundo real. En esto es necesario inicializar la matriz foundFiles
primero a longitud cero.
(Como se enfatizó en otras respuestas: Esto inicializa no un elemento y especialmente un elemento con índice cero porque eso significaría que la matriz tenía longitud 1. ¡La matriz tiene longitud cero después de esta línea!).
Si = string[0]
se omite la parte , ¡hay un error de compilación!
Esto se debe al bloque de captura sin volver a lanzar. El compilador de C # reconoce la ruta del código, que la función Directory.GetFiles()
puede lanzar una excepción, de modo que la matriz podría no ser inicializada.
Antes de que nadie diga, no volver a lanzar la excepción sería un mal manejo de errores: esto no es cierto. El manejo de errores debe cumplir con los requisitos.
En este caso, se supone que el programa debe continuar en el caso de un directorio que no se puede leer, y no se rompe, el mejor ejemplo es una función que atraviesa una estructura de directorio. Aquí el manejo de errores es solo registrarlo. Por supuesto, esto podría hacerse mejor, por ejemplo, recopilar todos los directorios con erroresGetFiles(Dir)
llamadas en una lista, pero esto conducirá demasiado lejos aquí.
Es suficiente afirmar que evitar throw
es un escenario válido, por lo que la matriz debe inicializarse a la longitud cero. Sería suficiente hacer esto en el bloque catch, pero sería un mal estilo.
La llamada a GetFiles(Dir)
cambiar el tamaño de la matriz.
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);