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

Как передать дополнительные параметры методу в 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 ...
}

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

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

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

12 ответов


используйте атрибут 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) .. 
}

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);

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


очевидным ответом на это должно быть, не так.

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

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

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


Регистрация В C# 4.0 Дополнительные Параметры.

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

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

перегрузка метода-это решение :

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

public void SendCommand(String command, String fileName)
{
    // your code here
} 

люди,

Я смотрел на этот поток, пытаясь решить проблему, которая на самом деле не существует, потому что 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

сладкий!

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

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

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

Ура. Кит.

PS: интересно, если VB.NET ведет себя так же? Полагаю, так и должно быть.


есть три простых решения для этого:

  1. перегрузить метод
  2. разрешить методу принимать "null" и обрабатывать соответствующим образом
  3. используйте .NET 4, который позволяет необязательные параметры

создать другой метод, который вызывает первый?

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

перегрузка функции. вместо проверки условной ветви. Что-то вроде этого:--2-->

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

}

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

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

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

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

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


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

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

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

public void UploadFileToServer(string strfilename)
{
    //Uploading file to Server
    //code
}

вы можете использовать ключевое слово 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");
}