2012-08-03 23 views
14

mam ten kod:C# Sprawdź, czy zdałeś argumenty lub nie

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){...} 
    } 
} 

Próbowałem też if(args.Length==0), ale nadal nie działa.

Zasadniczo chcę sprawdzić, czy użytkownik wywołał program z argumentami. Jeśli nie, program poprosi o dane wejściowe.

Jak mogę to zrobić? Z góry dzięki.

+3

Co stanie się, gdy spróbujesz 'args.Length == 0'? –

+2

Co nie działało z 'args.Length == 0'? Skromna wskazówka na przyszłość: Kiedy mówisz "to nie działa", to nie jest wystarczające wyjaśnienie problemu. Opracuj, powiedz, co nie działa, jak to nie działa, co dzieje się zamiast tego, czego się nie spodziewasz, itp. =) –

+0

Kiedy używasz 'if (args.Length == 0)', i to doesn ' t działa, co robi zamiast działać? – phoog

Odpowiedz

28

if(args.Length==0) powinien zadziałać, args[0] wymaga co najmniej jednego argumentu, aby się nie zawiesić.

8
if(args == null || args.Length == 0) 
{ 
    // no arguments 
} 
else 
{ 
    // arguments 
} 
4

Jest to tablica i istnieją dwa scenariusze, które mogą mieć znaczenie NO arguments passed. W zależności od semantyki

args == null lub args.Length == 0

W tym przypadku, w którym metoda jest wywoływana, gdy program jest wykonywany (np nie wywołując metodę jako część powiedzieć badanej jednostki) Argument args nigdy nie będzie zerowa (pierwszy test jest nadmiarowy) Zawarłem to dla kompletności, ponieważ ta sama sytuacja może być łatwo napotkana innymi metodami niż główna metoda, jeśli testujesz je w tej kolejności, nie musisz się martwić o to, że args ma wartość null ostatnie wyrażenie

if(args == null || args.Length == 0){ 
    ComputeNoParam cptern = new ComputeNoParam(); 
    cptern.ComputeWithoutParameters(); 
} 
else 
{ 
    ComputeParam cpter = new ComputeParam(); 
    foreach (string s in args){...} 
} 
+0

Proszę użyć ".Length" .. uważać na dużą literę, a nie ".length" – levteck

4

ta powinna także działać:

if (args.Length < 1) 
{ 
    //no args passed 
} 
-1

Inna opcja dostępna, jeśli używasz już System.Linq jest skorzystać z rozszerzeniem Any(), na przykład:

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){...} 
} 

Może to również być napisane:

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){...} 
} 

To pokazuje inną dostępną opcję, zgadzam się z g z .Length, mimo że chciałbym zrezygnować z kontroli zerowej i zamiast tego użyć dostępu warunkowego, więc.

if (args?.Length == 0) { 
    // Code hit if args is null or zero 
} 
Powiązane problemy