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

时间:2010-07-29 08:43:14

标签: .net c#-4.0 optional-parameters

如何将可选参数传递给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

如何实现?

13 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:11)

使用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) .. 
}

答案 2 :(得分:3)

明显的答案应该是,不要这样做

对于每个命令,您应该有一个单独的方法,或者每个命令都有一个命令基类和一个单独的派生类,使用Execute方法。

设计一个处理所有可能的命令的方法是不好的设计。

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

答案 3 :(得分:1)

检查C# 4.0 Optional Parameters

还要确保使用的是.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
} 

答案 4 :(得分:1)

民间,

我正在看这个线程,试图解决一个实际上并不存在的问题,因为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的行为是否相同?我认为必须这样做。

答案 5 :(得分:0)

这个有三个简单的解决方案:

  1. 重载方法
  2. 允许方法接受'null',并正确处理
  3. 使用.NET 4,它允许使用可选参数

答案 6 :(得分:0)

创建另一个调用第一个方法?

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

答案 7 :(得分:0)

重载功能。而不是检查条件分支。像这样:

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

}

答案 8 :(得分:0)

您可以通过几种方式完成此操作。如果您使用的是.NET 4.0,则可以在方法上使用可选参数:

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

否则,您可以创建另一个方法来调用您已有的方法,但是传递您想要的可选默认参数:

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

答案 9 :(得分:0)

c#4.0中的可选参数功能here是链接。否则你必须编写重载函数。

答案 10 :(得分:0)

此页面上给出的所有答案都是接受可选参数的有效方法,但在许多情况下,这表明您的方法试图做太多。

在许多情况下,使用以下明确的方法可能会更好......

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

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

答案 11 :(得分:0)

您可以使用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");
}

答案 12 :(得分:0)

此处尚未建议使用 Runtime.InteropServices 命名空间的[option]属性。

选中4 Different ways to make Method Parameter Optional in C#