0

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

public object[] Dispatch(string arg)
{
    int time;
    int i = 0;
    object[] array = new object[10];
    if (int.Parse(arg) >= 0 && int.Parse(arg) <= 20)
    {
        array[i] = new ComputeParam(int.Parse(arg));
    }
    else
    {
        if (arg[0] == '/' && arg[1] == 't')
        {
            Options opt = new Options();
            time = opt.Option(arg);
        }
    }
    return array;
}

プログラムに引数を渡し、ArgsParser数値の場合は配列に入れるか、引数が のような場合は遅延時間を設定します/t:=Max。問題は、配列と時間の両方が必要であり、2 つの値を返すことができないということです。この問題を解決するにはどうすればよいですか?

4

6 に答える 6

9

そのために戻りクラスを使用できます。カスタム オブジェクトを作成するだけです。

public class DataRC {
      public object[] aObj { get; set;}
      public DateTime dtTime {get; set;}
}

関数を変更すると、次のようになります。

public class ArgsParser
{

   public DataRC Dispatch(string arg)
   {
       DataRC dResult = new DataRC();
       int time;
       int i = 0;
       dResult.aObj = new object[10];
       if (int.Parse(arg) >= 0 && int.Parse(arg) <= 20)
       {
           dResult.aObj[i] = new ComputeParam(int.Parse(arg));
       }
       else
       {
           if (arg[0] == '/' && arg[1] == 't')
           {
               Options opt = new Options();
               // Is this where you need the time?
               dResult.dtTime = opt.Option(arg);
           }
       }
       return dResult;
   }
 }
}
于 2012-08-06T07:21:10.117 に答える
3

時間を返すためにacシャープアウトパラメータを使用します。これにより、関数から複数の値を返すことができます。メソッドパラメータのoutメソッドパラメータキーワードにより、メソッドはメソッドに渡されたのと同じ変数を参照します。メソッド内のパラメーターに加えられた変更は、制御が呼び出し元のメソッドに戻るときにその変数に反映されます。

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.71).aspx

于 2012-08-06T07:19:32.250 に答える
2

.net フレームワークが指定されていない限り、新しいフレームワーク バージョンで Tuple 型を使用できます。

Tuple<object[], DateTime> Dispatch(string arg)

しかし、Shai が書いたように、そのための return クラスを作成した方がよいでしょう。

于 2012-08-06T07:24:12.133 に答える
1

Parse()クラッシュします!使用するTryParse()

  1. がまたは他の非整数の argようなものに等しい場合、例外をスローします。/t:=Maxint.Parse(arg)
  2. int.Parse()不必要に2回(さらに!)呼び出しています。

したがって、次のように変更する必要がありますif-else

...
int argInt;
if(int.TryParse(arg, out argInt) && ...)
{
    array[i] = new ComputeParam(argInt);
}
else
...


あなたの答え:

オプション1:outパラメーター

メソッド定義を以下に変更し、timeすでに行ったように設定します。

public object[] Dispatch(string arg, out int time)

オプション2:戻り値をオブジェクトにカプセル化する

以下のようなクラスを定義し、そのインスタンスを返します。

class DispatchReturn
{
    object[] array;
    int      time;
}

次にそれを返します:

public DispatchReturn Dispatch(string arg)

オプション3:パーサークラスを変更します。しないでください!

arrayパーサー内とパーサー内の両方timeをフィールドとして配置できますが、避けてください。関心の分離に違反します。


要約

public ComputeParam[] Dispatch(string arg, out time)
{
    if (arg == null)
        throw new ArgumentNullException("arg");

    ComputeParam[] array = new ComputeParam[1];
    int argInt;

    if (int.TryParse(arg, out argInt) && 0 <= argInt && argInt <= 20)
    {
        array[0] = new ComputeParam(argInt);
        time     = 0; // You must always set an out param
    }
    else if (arg.StartsWith("/t")
    {
        time = new Options().Option(arg);
    }

    return array;
}

次の質問に答える必要があります。

  1. iですか?これは常に等しい0ですか?
  2. リターンタイプがobjectsではなくsの配列であるのはなぜComputeParamですか?
  3. なぜ10個の要素の配列を作成し、1つだけ配置するのですか?

上記のコードは、回答に応じて大幅に変更される可能性があります。

于 2012-08-06T07:43:18.530 に答える
1

次のいずれかを実行できます。

  1. パラメータを使い切る
  2. 戻り値の型のカスタム クラスを作成し、そこに戻りたいものをカプセル化します。

私はアプローチ 2 を好みます。これは、戻りパラメーターが乱雑になる可能性があり、期待どおりのカスタム オブジェクトが返された場合、コードの呼び出しがよりクリーンになるためです。しかし、もちろん、それはそれぞれの状況に依存します。

于 2012-08-06T07:24:25.143 に答える
0

Shaiの回答をさらに詳しく説明するためArgsParserに、出力パラメーター自体を保持することができます。正しいと思われる場合は、構文解析をコンストラクターで実行できます。

public class ArgsParser
{
   public object[] aObj { get; set;}
   public DateTime dtTime {get; set;}

   public ArgsParser(string arg)
   {
       int time;
       int i = 0;
       aObj = new object[10];
       if (int.Parse(arg) >= 0 && int.Parse(arg) <= 20)
       {
           aObj[i] = new ComputeParam(int.Parse(arg));
       }
       else
       {
           if (arg[0] == '/' && arg[1] == 't')
           {
               Options opt = new Options();
               // Is this where you need to time?
               dtTime = opt.Option(arg);
           }
       }
   }
 }
}

ArgsParser はパラメーターの解析のためだけに存在すると思います

于 2012-08-06T07:27:28.777 に答える