繁体   English   中英

如何在方法中放置可选参数?

[英]How do I put optional parameters in methods?

是否可以在方法中声明可选参数?

例如,在delphi中,我可以执行以下操作:

procedure Test(p1:integer;p2:integer;p3:integer = 2;p4:integer = 4)

当我调用该函数时,可以使用四个参数或两个参数来调用它:

Test(2,3); //p3 = 2,p4 = 4.
Test(2,3,4,5); //p3 = 4,p4 = 5;

在C#中怎么可能?

恐怕这在C#1至3中是不可能的。但是,好消息是,由于它是一项要求很高的功能(尽管当然有些人不愿看到它),微软最终决定添加它到C#4。

C#4语法如下:

public static void SayHello(string s = "Hello World!")
{
    Console.WriteLine(s);
}

用法:

SayHello(); // Prints "Hello World!"
SayHello("Hello."); // Prints "Hello."
SayHello(s: "Hello."); // Prints "Hello."

(最后一个示例使用了一个命名参数,在这种情况下,这实际上不是必需的,但是当您有多个可选参数时会有所帮助。)

您可以在此博客文章上了解有关该主题的更多信息

您要么必须等待支持可选参数的C#4.0 ,要么使用标准的重载机制:

void Test(int p1, int p2, int p3, int p4)
{ }

void Test(int p1, int p2)
{
    Test(p1, p2, 2, 4);
}

在C#4.0中是可能的,但是直到发布该代码之前,您可以通过创建方法的重载版本来解决它:

public void MyMethod( int a, int b, int c )
{
    ...
}

public void MyMethod( int a, int b)
{
   MyMethod(a, b, 4);
}

您可以使用可变参数

使用params关键字。

void paramsExample(params int[] argsRest)
{

 if(argsRest.Length == 2) then...
 else if(argsRest.Length == 4) then...
 else error...

}
using System;
using System.Runtime.InteropServices;

   public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
   {
      Console.WriteLine(s);
   }

做完了! :)

您还不能这样做。 我认为这是C#4.0功能

您可以使用params来解决,但是只能顺序使用,而不能使用某些语言对待默认参数的方式。

您使用这样的重载

Test(int p1, int p2)
Test(int p1, int p2, int p3)

您可以让他们像这样调用私有方法

Test(int[] ps)

然后处理数据。

解决此问题的另一种方法是不使用重载/可选参数,而是根据要执行的操作来命名方法-这似乎是一个不好的权衡,但是您的代码可能会更易于阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM