c # main метод игнорирует строковые переменные - PullRequest
0 голосов
/ 24 июня 2009

Мне дали написать небольшой проект на c #, который, по сути, заключает в себе несколько библиотек в консольном приложении.

Я столкнулся с тем, что считаю странной проблемой. Я объявил пару локальных переменных в методе main для использования. Идея состоит в том, что при разборе аргументов их значения сохраняются в этих переменных (аргументы находятся в парах ключей, например -u: имя пользователя).

Ниже приведен код, который я использую для запуска процесса.

namespace ziptogo
{
public class ZipToGo
{


    public static void Main(string[] args)
    {

        string user = null;
        int divisionid = 0;
        string mysqlServer = null;
        string mysqlName = null;
        string mysqlUser = null;
        string mysqlPwd = null;
        string barcode = null;
        bool zipped = false;

        ZipToGo ziptogo = new ZipToGo();

        if (args.Length == 0)
        {
            ziptogo.usage();
        }

        //we look throught the arguments and extract the values.
        for (int i = 0; i < args.Length; i++)
        {

            string[] values = ziptogo.getArgValue(args[i]);

            if (values[0].Equals("-U") || values[0].Equals("-u"))
            {
                user = values[1];
            }

            if (values[0].Equals("-D") || values[0].Equals("-d"))
            {
                divisionid = Int32.Parse(values[1]);
            }
....

Поскольку я новичок в написании на c #, я упускаю что-то очевидное в отношении того, почему строки, такие как mysqlServer, игнорируются методом main ??

Целочисленное деление и строковый штрих-код - единственные переменные, которые не игнорируются методом.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 24 июня 2009

Чтобы проверить это быстро, вы можете добавить эту строку сразу после Main ():

 args = new String[] { "-u:username" };

Затем пошагово пройдитесь по коду, используя отладчик.

[Редактировать] Если getArgValue выглядит примерно так:

 public String[] getArgValue(String s)
 {
     return s.Split(':'); 
 }

тогда это должно работать ИМХО (быстро и грязно, просто чтобы запустить его).

[Редактировать:] Есть несколько хороших решений для синтаксического анализа командной строки, которые устраняют необходимость добавлять все эти условные выражения, например, http://www.codeproject.com/KB/recipes/commandlineparser.aspx.

0 голосов
/ 24 июня 2009

Посмотрите на этот код и посмотрите, поможет ли он. Он должен делать именно то, что вы хотите, и немного чище.

string[] args = new string[] {"-u:username", "-dbs:servername", "-dbu:dbuser", "-dbp:dbpassword"};

string user = null;
int divisionid = 0;
string mysqlPwd = null;

foreach (string arg in args)
{
    string[] parts = arg.Split(':');

    switch (parts[0].ToUpper())
    {
        case "-U":
            user = parts[1];
            break;
        case "-D":
            divisionid = Int32.Parse(parts[1]);
            break;
        case "-DBP":
            mysqlPwd = parts[1];
            break;
            // ....
        default:
            // Display usage
            break;
    }
}

Debug.WriteLine(string.Format("User {0} | Password {1}", user, mysqlPwd));

Очевидно, что часть args должна исходить из командной строки, а не быть жестко закодированной.

0 голосов
/ 24 июня 2009

Что делает getArgValue (string [])?

Бьюсь об заклад, если вы делаете ...

public static void Main(string[] args)    
{  
    if ( args.Length > 0 )
        System.Diagnostics.Debug.WriteLine( args[0] );

/* etc */

}

Вы увидите ваш пропавший "-d".

0 голосов
/ 24 июня 2009

Знаете ли вы о отладчике?

Если вы используете Visual Studion, сделайте это.

  1. Установить строку в строку user = null;
  2. Нажмите F9 (Переключить точку останова);
  3. Нажмите F5 (отладка Strat);
  4. Нажмите F10, чтобы просмотреть ваше приложение;

Я думаю, вы быстро найдете, что не так. Часто это глупые опечатки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...