typeparam - C#comprueba si has pasado argumentos o no
summary c# visual studio (6)
Tengo este codigo
public static void Main(string[] args)
{
if (string.IsNullOrEmpty(args[0])) // Warning : Index was out of the bounds of the array
{
ComputeNoParam cptern = new ComputeNoParam();
cptern.ComputeWithoutParameters();
}
else
{
ComputeParam cpter = new ComputeParam();
foreach (string s in args){...}
}
}
También se probó if(args.Length==0)
, pero todavía no funciona.
Básicamente, quiero saber si el usuario llamó al programa con argumentos. Si no es así, el programa pedirá entrada.
¿Cómo puedo hacer esto? Gracias por adelantado.
Esto debería funcionar en su escenario:
if (args == null || args.Length == 0)
{
//Code when no arguments are supplied
}
else
{
//Code when arguments are supplied
}
Observe cómo check args == null
debe ejecutarse antes de args.Length == 0
cuando se usa || o &&. Esto se denomina "cortocircuito de condición", donde C # comenzará a evaluar la primera condición y, si es verdadera, no observará la segunda condición. En este escenario, C # evaluará la segunda condición solo si la primera condición es falsa.
Supongamos que si sus condiciones se alinean como if(args.Length == 0 || args == null)
y args
vuelvan null,
lanzará una excepción en la primera condición, aunque la segunda condición sea verdadera.
Esto es algo que debemos tener en cuenta al colocar las condiciones.
Esto también debería funcionar:
if (args.Length < 1)
{
//no args passed
}
Otra opción disponible si ya está usando System.Linq
es hacer uso de la extensión Any()
, por ejemplo:
public static void Main(string[] args)
{
if (args == null && !args.Any())
{
// No parameters passed.
ComputeNoParam cptern = new ComputeNoParam();
cptern.ComputeWithoutParameters();
return;
}
// process parameters
ComputeParam cpter = new ComputeParam();
foreach (string s in args){...}
}
Esto también podría ser escrito:
public static void Main(string[] args)
{
if (!args?.Any() ?? true)
{
// No parameters passed.
ComputeNoParam cptern = new ComputeNoParam();
cptern.ComputeWithoutParameters();
return;
}
// process parameters
ComputeParam cpter = new ComputeParam();
foreach (string s in args){...}
}
Esto solo muestra otra opción disponible para usted, estoy de acuerdo con seguir con .Length
, aunque eliminaría la verificación nula y usaría el acceso condicional en su lugar, entonces.
if (args?.Length == 0) {
// Code hit if args is null or zero
}
es una matriz y hay dos escenarios que podrían tener el significado de NO argumentos pasados. Dependiendo de tu semántica
args == null
o args.Length == 0
En este caso donde se llama al método cuando se ejecuta el programa (p. Ej., No se llama al método como parte de, por ejemplo, una prueba de unidad), el argumento args nunca será nulo (lo que hace que la primera prueba sea redundante). La misma situación podría encontrarse fácilmente en otros métodos distintos a los principales.
Si los prueba en ese orden, no tiene que preocuparse por que los argumentos sean nulos en la última expresión.
if(args == null || args.Length == 0){
ComputeNoParam cptern = new ComputeNoParam();
cptern.ComputeWithoutParameters();
}
else
{
ComputeParam cpter = new ComputeParam();
foreach (string s in args){...}
}
if(args.Length==0)
debería funcionar, args[0]
requiere al menos un argumento para no fallar.
if(args == null || args.Length == 0)
{
// no arguments
}
else
{
// arguments
}