Как передать необязательные параметры методу в C #? - PullRequest
9 голосов
/ 29 июля 2010

Как передать необязательные параметры методу в C #?

Предположим, я создал один метод под названием Sendcommand

public void SendCommand(String command,string strfilename)
{

    if (command == "NLST *" ) //Listing Files from Server.
    {
        //code
    }
    else if (command == "STOR " + Path.GetFileName(uploadfilename)) //Uploading file to Server
    {
        //code
    }
    else if ...
}

Теперь я хочу вызвать этот метод в основном методе, как

Sendcommand("STOR ", filename);
Sendcommand("LIST"); // In this case i dont want to pass the second parameter

Как этого добиться?

Ответы [ 12 ]

15 голосов
/ 29 июля 2010

Pre .NET 4 нужно перегрузить методом:

public void sendCommand(String command)
{
    sendCommand(command, null);
}

.NET 4 представляет поддержку параметров по умолчанию, которые позволяют вам делать все это в одной строке.

public void SendCommand(String command, string strfilename = null)
{
  //method body as in question
}

Кстати, в вопросе, который вы написали, вы также не вызываете метод в первом примере:

Sendcommand("STOR " + filename);

по-прежнему использует один параметр, который является объединением двух строк.

11 голосов
/ 29 июля 2010

Используйте атрибут params:

public void SendCommand(String command, params string[] strfilename)
{
}

тогда вы можете назвать это так:

SendCommand("cmd");
SendCommand("cmd", "a");
SendCommand("cmd", "b");

или, если вы используете C # 4.0, вы можете использовать новую опцию необязательных аргументов:

public void SendCommand(String command, string strfilename=null)
{ 
   if (strfilename!=null) .. 
}
3 голосов
/ 29 июля 2010

Очевидный ответ для этого должен быть: не делайте так .

У вас должен быть либо отдельный метод для каждой команды, либо базовый класс команд и отдельный производный класс для каждой команды с методом Execute.

Нехорошо иметь один метод, который обрабатывает каждую мыслимую команду.

Вы действительно не хотите, чтобы один Sendcommand() обрабатывал все возможные команды.

1 голос
/ 26 сентября 2012

Люди,

Я смотрел на эту ветку, пытаясь решить проблему, которой на самом деле не существует, потому что C # "просто проходит" через массив params! Что я не знал, пока не попробовал.

Вот SSCCE:

using System;
using System.Diagnostics; // for Conditional compilation of method CONTENTS

namespace ConsoleApplication3
{
    public static class Log
    {
        [Conditional("DEBUG")] // active in Debug builds only (a no-op in Release builds)
        public static void Debug(string format, params object[] parms) {
            Console.WriteLine(format, parms); 
            // calls Console.WriteLine(string format, params object[] arg);
            // which I presume calls String.Format(string format, params object[] arg);
            // (Sweet! just not what I expected ;-)
        }
    }

    class Program //LogTest
    {
        static void Main(string[] args) {
            Log.Debug("args[0]={0} args[1]={1}", "one", "two");
            Console.Write("Press any key to continue . . .");
            Console.ReadKey();
        }

    }
}

Производит:

args[0]=one args[1]=two

Сладкие!

Но почему? ... Ну, потому что (конечно) самое близкое соответствие параметра сильно перегруженному методу Console.WriteLine - (string format, params object[] arg) ... не (string format, object arg), как я думал.

Я вроде знал, что это должно было быть как-то возможно, потому что (я полагаю) Console.WriteLine делает это, я просто почему-то ожидал, что это будет ТРУДНО ... и поэтому думаю, что простота и "приятность" этого трюка -язычие достойно внимания.

CSharpLanguageDesigners.ToList().ForEach(dude=>dude.Kudos++);

Приветствия. Кит.

PS: Интересно, ведет себя ли VB.NET так же? Я полагаю, это должно.

1 голос
/ 29 июля 2010

Проверка C # 4.0 Необязательные параметры .

Также убедитесь, что вы используете .NET 4.

Если вам нужно использовать более старые версии .NET.

Решением является перегрузка метода:

public void SendCommand(String command)
{
    SendCommand(command, null);
    // or SendCommand(command, String.Empty);
} 

public void SendCommand(String command, String fileName)
{
    // your code here
} 
0 голосов
/ 29 июля 2010

Вы можете использовать ключевое слово params:

private static void SendCommand(String command, params string[] filenames)
{

    if (command == "NLST *" ) //Listing Files from Server.
    {
        //code
    }

    if (command == "STOR ")
    {
        foreach (string fileName in filenames)
        {
            if (String.IsNullOrWhiteSpace(fileName))
            {
                // code
            }
        }
    }
}

и вы можете использовать его как:

static void Main(string[] args)
{
    SendCommand("NLST *");
    SendCommand("STOR ", "myfile1.txt", "myfile.txt");
}
0 голосов
/ 29 июля 2010

Все ответы, приведенные на этой странице, являются допустимыми способами принятия необязательных параметров, но во многих случаях это признак того, что ваш метод пытается сделать слишком много.

Во многих случаях вы можетелучше со следующими однозначными методами ...

public void GetFileListFromServer()
{
    //Listing Files from Server.
    //code
}

public void UploadFileToServer(string strfilename)
{
    //Uploading file to Server
    //code
}
0 голосов
/ 29 июля 2010

Опциональные параметры доступны в c # 4.0 здесь - ссылка. В противном случае вы должны написать перегруженную функцию.

0 голосов
/ 29 июля 2010

Вы можете сделать это несколькими способами. Если вы используете .NET 4.0, вы можете использовать дополнительные параметры для метода:

public void SendCommand(String command,string strfilename = null)
{
    ....
}

В противном случае вы можете просто создать другой метод, который вызывает метод, который у вас уже есть, но с передачей параметров по умолчанию, которые вы хотите использовать в качестве необязательных:

public void SendCommand(String command)
{
    SendCommand(command,null);
}
0 голосов
/ 29 июля 2010

Перегрузка функции. а не проверка на условную ветвь. Примерно так:

public void SendCommand(String command,string strfilename)
{    
    if (command == "STOR " + 
        Path.GetFileName(uploadfilename)) //Uploading file to Server
    {
        //code
    }
    else if ............
}

public void SendCommand(String command)
{ 
        //code

}
...