如何将可选参数传递给C#中的方法?

Swa*_*pta 9 .net optional-parameters c#-4.0

如何将可选参数传递给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 ...
}
Run Code Online (Sandbox Code Playgroud)

现在我想在main方法中调用此方法

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

怎么实现呢?

Mar*_*ris 15

在.NET 4之前,您需要重载该方法:

public void sendCommand(String command)
{
    sendCommand(command, null);
}
Run Code Online (Sandbox Code Playgroud)

.NET 4引入了对默认参数的支持,允许您在一行中完成所有这些操作.

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

顺便说一下,在你编写的问题中,你不是在第一个例子中调用方法:

Sendcommand("STOR " + filename);
Run Code Online (Sandbox Code Playgroud)

仍然使用单个参数,这是两个字符串的串联.


cod*_*nix 12

使用params属性:

public void SendCommand(String command, params string[] strfilename)
{
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它:

SendCommand("cmd");
SendCommand("cmd", "a");
SendCommand("cmd", "b");
Run Code Online (Sandbox Code Playgroud)

或者如果您使用C#4.0,则可以使用新的可选参数功能:

public void SendCommand(String command, string strfilename=null)
{ 
   if (strfilename!=null) .. 
}
Run Code Online (Sandbox Code Playgroud)

  • 在可以看到的地方添加此评论 - 请不要实现一个方法来完成许多完全不同的事情。一种方法应该粗略地说做一项任务。这意味着简单的命令可能在不同的方法中——或者如果命令很复杂,为每个命令创建一个类。这是为了可维护性、可读性、可调试性等。SendCommand 也应该适当命名;它真的在某个地方发送命令吗?如果需要,它可以被称为 ParseCommand - 它解析它并将执行留给其他方法/类。 (2认同)

Kie*_*one 5

对此的显而易见的答案应该是,不要那样做

您应该为每个命令拥有一个单独的方法,或者为每个命令拥有一个命令基类和一个单独的派生类,以及一个 Execute 方法。

拥有一种方法来处理所有可能的命令是糟糕的设计。

你真的不希望一个Sendcommand()人处理每一个可能的命令。

  • 是的。实际上有 100 个类会更好——一个包含 100 个方法的文件太多了。这两个选项都比处理 100 个命令的执行的方法好一百倍!你能想象这个方法需要多长时间,调试会有多困难,它必须有多少可选参数:可能缩进太多以至于很难看出哪个 { 或 } 是哪个。您绝对,绝对,绝对不想要一种方法来处理所有命令。每个命令一个或每个命令一个类。 (5认同)