如何将可选参数传递给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
如何实现?
答案 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)
还要确保使用的是.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)
这个有三个简单的解决方案:
答案 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]
属性。