2016-09-22 62 views
-1

下面的示例代碼需要兩個字符串參數從CMD如如何將一個空參數傳遞給主類?

c:\myprogram.exe bobby henn 

輸出

first name is bobby 
last name is henn 

但是當我通過只有一個參數將其擲我錯誤,即使我中所指定的長度,如果情況

c:\myprogram.exe bobby 

未處理的異常:System.IndexOutOfRangeException:索引是 超出數組範圍。在command.Program1.Main(字符串[] 參數)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Text; 

namespace command 
{ 
    public class Program 
    { 
     public void ben(string bobby, string x) 
     { 

      if (bobby == null | x.Length < 1) 
      { 
       Console.WriteLine("Empty value, pass any parameter"); 
      } 

      else 
      { 

       Console.WriteLine("First Name is " + bobby); 
       Console.WriteLine("Last Name is " + x); 
       Console.ReadLine(); 
      } 
     } 

    } 

    class Program1 
    { 
     static void Main(string[] args) 
     { 
     Program glb = new Program(); 
     glb.ben(bobby:args[0],x:args[1]); 
     } 
    } 

} 

並且也有任何其他方式來調用參數到主要方法,而不是bobby:args[0],x:args[1]

+0

http://stackoverflow.com/a/271600/3585278 – Danieboy

+2

你必須檢查有多少參數傳入'Main'。如果只有一個,你必須用'string.Empty'或'null'來調用'ben'。 – germi

+0

@Danieboy:與傳遞null參數無關 - 這是數組邊界異常的問題 - 只能通過檢查參數數量來解決。 – PaulF

回答

1

您可以使用ElementAtOrDefault擴展方法從System.Linq,而不是方括號運算符:

glb.ben(bobby:args.ElementAtOrDefault(0), x:args.ElementAtOrDefault(1)); 

它將返回null如果索引超出範圍的給定數組,而不是拋出異常。

+0

這解決了這個問題。謝謝 – Bobby

0
static void Main(string[] args) 
     { 
     Program glb = new Program(); 

     if(args.length==2) 
     glb.ben(args[0],x:args[1]); 
     else 
     glb.ben(args[0]); 
     } 

而改變這種

 public void ben(string bobby, string x = null) 
0

除了應付檢查的輸入參數個數的答案:只要你傳遞參數的定義的順序,那麼你不需要使用參數名稱的前綴

glb.ben(bobby:args[0],x:args[1]); 

能被簡化爲

glb.ben(args[0],args[1]); 

如果你想通過以不同的順序參數,那麼你可以使用

glb.ben(x:args[1], bobby:args[0]); 
+0

參數簡化了,謝謝 – Bobby

+0

雖然在你的情況下不是問題,但命名參數有一個很小的性能影響 - 編譯器爲指定參數生成臨時變量,然後以正確的順序使用臨時變量實際調用方法。 – PaulF