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. 问题是我需要数组和时间,而且我不能返回两个值。我该如何解决这个问题?

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 sharp out 参数返回时间。这将允许您从一个函数返回多个值。方法参数上的 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 所写,最好为此创建一个返回类。

于 2012-08-06T07:24:12.133 回答
1

您可以:

  1. 使用出参数
  2. 为返回类型创建一个自定义类,并在其中封装您想要返回的内容。

我更喜欢方法 2,因为返回参数可能会变得杂乱无章,如果调用代码返回一个符合预期的自定义对象,它会变得更加简洁。但当然,这取决于每种情况。

于 2012-08-06T07:24:25.143 回答
1

Parse()会崩溃!采用TryParse()

  1. 如果arg等于/t:=Max或任何其他非整数, int.Parse(arg)则将抛出异常
  2. int.Parse()不必要地调用了两次(甚至更多!)。

因此,您应该将您的更改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. 为什么你的返回类型是 s 的数组object,而不是ComputeParams?
  3. 为什么要为10 个元素创建数组并只放置一个?

上面的代码可以根据您的答案进行重大更改。

于 2012-08-06T07:43:18.530 回答
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 回答