¿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?
c#
arrays
initialization
yogesh
fuente
fuente
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, llameToArray()
a la variable.Si debe crear una matriz vacía, puede hacer esto:
fuente
string[]
que no tiene elementos. Si intentas accederemptyStringArray[0]
, recibirás unIndexOutOfRangeException
Prueba esto:
fuente
int[] variable = new int[]{}
y lo usa, por ejemplo, en un bucle comoforeach (var s in variable){ Console.WriteLine(s);}
el código se compila en:int[] args1 = new int[0];
yforeach (int num in args1){Console.WriteLine(num);}
. Por lo tanto, no debería haber diferencia entre usarnew int[0]
ynew 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 (ostring[] a = new string[0];
).En .NET 4.6, la forma preferida es utilizar un nuevo método
Array.Empty
:La implementación es sucinta, utilizando cómo se comportan los miembros estáticos en clases genéricas en .Net :
(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>()
fuente
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
no no crear una matriz. Devuelve una referencia a una matriz preasignada.Puede iniciarlo con un tamaño de 0, pero tendrá que reiniciarlo, cuando sepa cuál es el tamaño, ya que no puede agregarlo a la matriz.
fuente
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 :
[ Los elementos dentro del paréntesis deben ser implícitamente convertibles al tipo definido, por ejemplo,
string[] a = { "a", "b" };
]O aún otro:
Aquí hay una forma más declarativa :
Ahora puedes llamar:
fuente
Simple y elegante!
fuente
array
a justoa
, ya quearray
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íaString.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 <...> ()!
fuente
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.
fuente
int i = 5; string[] a = new string[i];
Había intentado:
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
O de otra manera que funcione para mí:
Asignación de valor para la lista:
fuente
Como sé, no puedes hacer una matriz sin tamaño, pero puedes usar
y luego
l.ToArray()
.fuente
Combinando sugerencias de @nawfal y @Kobi:
Ejemplo de uso:
ACTUALIZACIÓN 2019-05-14
(créditos a @Jaider ty)
Mejor uso de .Net API:
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
fuente
arr = Array.Empty<string>();
Tu puedes hacer:
Nota: OP significa no tener que especificar un tamaño, no hacer una matriz sin apresto
fuente
specify
un tamaño, no hacer una matrizsizeless
.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 errores
GetFiles(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.fuente