web-dev-qa-db-ja.com

引数を渡したかどうかのC#チェック

私はこのコードを持っています:

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

if(args.Length==0)も試してみましたが、まだ動作しません。

基本的に、ユーザーが引数付きでプログラムを呼び出したかどうかを調べたいです。そうでない場合、プログラムは入力を求めます。

これどうやってするの?前もって感謝します。

26
robertpas

if(args.Length==0)は機能するはずです、args[0]クラッシュしないようにするには、少なくとも1つの引数が必要です。

41
Albin Sunnanbo
if(args == null || args.Length == 0)
{
    // no arguments
}
else
{
    // arguments
}
10
Tom

これは配列であり、引数なしで渡されるという意味を持つ2つのシナリオがあります。セマンティクスに応じて

args == nullまたはargs.Length == 0

プログラムの実行時にメソッドが呼び出されるこの場合(たとえば、ユニットテストの一部としてメソッドを呼び出さないなど)、args引数がnullになることはありません(最初のテストを冗長にします)。メイン以外の方法でも同じ状況が簡単に発生する可能性があります

これらの順序でテストすれば、後者の式で引数がnullになることを心配する必要はありません。

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

これも動作するはずです:

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

これはシナリオで動作するはずです:

_if (args == null || args.Length == 0)
{
    //Code when no arguments are supplied
}
else
{
    //Code when arguments are supplied
}
_

||を使用する場合、_check args == null_を_args.Length == 0_の前に実行する方法に注意してください。または&&。これは「条件付き短絡」と呼ばれ、C#は最初の条件の評価を開始し、それが真の場合、2番目の条件を調べません。このシナリオでは、C#は最初の条件がfalseの場合にのみ2番目の条件を評価します。

条件がif(args.Length == 0 || args == null)およびargsが_null,_になるように調整されている場合、2番目の条件はtrueですが、最初の条件で例外をスローするとします。

これは、条件を設定するときに留意する必要があるものです。

1

既に_System.Linq_を使用している場合に利用できる別のオプションは、たとえば、次のようにAny()拡張を使用することです。

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

これは次のようにも書けます。

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

これは、使用可能な別のオプションを示しているだけです。.Length_を使用することに同意しますが、代わりにnullチェックを削除し、条件付きアクセスを使用します。

_if (args?.Length == 0) {
    // Code hit if args is null or zero
}
_
0
derpasaurus