2

我正在使用命令行参数,如果条件用于检查输入值但看起来不太好我可以将其更改为 switch 但我不知道如何更改它我的代码是

if (args.Length > 0 && args.Length == 4)
{
    string programName = args[0];
    string file1= args[2];
    string file2= args[3];

    bool flag = false;
    int num= 0;
    bool isNum = Int32.TryParse(args[1].ToString(), out num);

    if (!(programName.Equals("Army")))
    {
        Console.WriteLine("Error"); 
    }

    if (!Int32.TryParse(args[1].ToString(), out isNum ))
    {
        Console.WriteLine("value should be a number");
    }

    if (!File.Exists(file1))
    {
        Console.WriteLine("file 1 does not exist");
    }
    if (!File.Exists(file2))
    {
        Console.WriteLine("file 2 does not exist");
    }
4

4 回答 4

2

这里switch不需要声明。当您只有一个值并且需要根据该值从一系列可能的互斥步骤中进行选择时,这很有用。但这不是你在这里做的。这些不是if/else if键控值的语句链,它们更像是保护子句。所有这些都需要运行以确定要显示给用户的所有输出。

您可以通过删除花括号来缩短代码:

if (!(programName.Equals("Army")))
    Console.WriteLine("Error"); 
if (!Int32.TryParse(args[1].ToString(), out isNum ))
    Console.WriteLine("value should be a number");
if (!File.Exists(file1))
    Console.WriteLine("file 1 does not exist");
if (!File.Exists(file2))
    Console.WriteLine("file 2 does not exist");

您还可以将这些代码行提取到它们自己的方法中,这会使Main方法更简洁。您甚至可以将条件检查本身提取到非常小的方法中,以使其更像散文以提高可读性。但是条件结构本身并不需要改变。

于 2013-09-09T14:55:29.303 回答
1

您可以创建负责检索和检查应用程序参数的类。例如,如果您的应用程序名称为 Zorg,您可以创建以下类:

public class ZorgConfiguration
{        
    private string num;
    private string programName;
    private string file1;
    private string file2;

    public static ZorgConfiguration InitializeFrom(string[] args)
    {
        if (args.Length < 4)
           throw new ZorgConfigurationException("At least 4 arguments required");

        return new ZorgConfiguration {
            ProgramName = args[0],
            Num = args[1],
            File1 = args[2],
            File2 = args[3]
        };
    }

    // to be continued
}

如您所见,它的职责是保存应用程序设置。它具有从 args 数组创建配置实例的静态方法。此方法检查参数计数是否正确,然后使用适当的参数初始化配置类的每个属性。检查参数值移动到属性:

public string ProgramName
{
    get { return programName; }
    private set {
        if (value == "Army")
            throw new ZorgConfigurationException("Error");
        programName = value;
    }
}

public string Num
{
    get { return num; }
    private set {
        int i;
        if (!Int32.TryParse(value, out i))
            throw new ZorgConfigurationException("value should be a number");
        num = value;
    }
}

public string File1 
{
    get { return file1; }
    private set {
        if (!File.Exists(value))
            throw new ZorgConfigurationException("file 1 does not exist");
        file1 = value;
    }         
}

每个属性负责验证相应的参数值。如果值不正确,则自定义ZorgConfigurationException(即简单地从 继承的类Exception)被抛出。

现在主应用程序代码看起来很干净:

try
{
    var config = ZorgConfiguration.InitializeFrom(args);
    // you can use config.File1 etc
}
catch (ZorgConfigurationException e)
{
    Console.WriteLine(e.Message);
    // exit application
}
于 2013-09-09T16:25:00.317 回答
0

我使用这个类来解析命令行参数,我在某个地方找到了它,但我不记得在哪里:

public class Arguments { // 变量 private StringDictionary 参数;

    // Constructor
    public Arguments(string[] Args)
    {
        Parameters = new StringDictionary();
        Regex Spliter = new Regex(@"^-{1,2}|^/|=|:",
            RegexOptions.IgnoreCase | RegexOptions.Compiled);

        Regex Remover = new Regex(@"^['""]?(.*?)['""]?$",
            RegexOptions.IgnoreCase | RegexOptions.Compiled);

        string Parameter = null;
        string[] Parts;

        // Valid parameters forms:
        // {-,/,--}param{ ,=,:}((",')value(",'))
        // Examples: 
        // -param1 value1 --param2 /param3:"Test-:-work" 
        //   /param4=happy -param5 '--=nice=--'
        foreach (string Txt in Args)
        {
            // Look for new parameters (-,/ or --) and a
            // possible enclosed value (=,:)
            Parts = Spliter.Split(Txt, 3);

            switch (Parts.Length)
            {
                // Found a value (for the last parameter 
                // found (space separator))
                case 1:
                    if (Parameter != null)
                    {
                        if (!Parameters.ContainsKey(Parameter))
                        {
                            Parts[0] =
                                Remover.Replace(Parts[0], "$1");

                            Parameters.Add(Parameter, Parts[0]);
                        }
                        Parameter = null;
                    }
                    // else Error: no parameter waiting for a value (skipped)
                    break;

                // Found just a parameter
                case 2:
                    // The last parameter is still waiting. 
                    // With no value, set it to true.
                    if (Parameter != null)
                    {
                        if (!Parameters.ContainsKey(Parameter))
                            Parameters.Add(Parameter, "true");
                    }
                    Parameter = Parts[1];
                    break;

                // Parameter with enclosed value
                case 3:
                    // The last parameter is still waiting. 
                    // With no value, set it to true.
                    if (Parameter != null)
                    {
                        if (!Parameters.ContainsKey(Parameter))
                            Parameters.Add(Parameter, "true");
                    }

                    Parameter = Parts[1];

                    // Remove possible enclosing characters (",')
                    if (!Parameters.ContainsKey(Parameter))
                    {
                        Parts[2] = Remover.Replace(Parts[2], "$1");
                        Parameters.Add(Parameter, Parts[2]);
                    }

                    Parameter = null;
                    break;
            }
        }
        // In case a parameter is still waiting
        if (Parameter != null)
        {
            if (!Parameters.ContainsKey(Parameter))
                Parameters.Add(Parameter, "true");
        }
    }

    // Retrieve a parameter value if it exists 
    // (overriding C# indexer property)
    public string this[string Param]
    {
        get
        {
            return (Parameters[Param]);
        }
    }
}

我这样使用它:

var cmdParams = 新参数(args);

if (cmdParams["File"] != null && parametros["cmdParams"] == "Filename.txt) { }

希望能帮助到你!

于 2013-09-09T14:57:41.610 回答
0

如果有不同的函数和参数,命令行参数可能会变得复杂。

最好的方法是标记您的参数,函数开关示例是 /p /a 或 -h、-g 等...您的 cmd arg 解析器会查找这些标记(模式)-一旦找到您就知道它是哪个 cmd.. 有switch - case 或任何其他机制。还要标记其他数据参数。因此,您有两组参数 - 易于管理。

于 2013-09-09T16:43:34.020 回答