【问题标题】:How do I put optional parameters in methods?如何将可选参数放入方法中?
【发布时间】:2009-05-05 09:00:26
【问题描述】:

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

例如,在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# methods


【解决方案1】:

恐怕这在 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."

(最后一个示例使用命名参数,在这种情况下确实没有必要,但在您有多个可选参数时会有所帮助。)

您可以在 this blog post 上阅读有关该主题的更多信息。

【讨论】:

  • 真的吗?我不太确定他们的要求很高。看到 VB 充斥着命名/可选参数,我很高兴 c# 没有它们。我真的不期待他们。
  • @Deviant:我注意到有足够多的博主为他们的缺席感到遗憾(尽管也有一两个人表示他们很高兴拥有他们,诚然)——尽管我可能错了这个。它们在简化 COM 方法调用中的使用将是美好的生活,我相信你不能否认。
  • 我的第二个偏差 - 我从来不明白为什么重载不仅仅是相同功能的完全更好的版本。给定可选参数的检查和分支代码非常不优雅,更不用说检查可选参数排列的代码了。
  • 是的,所以这个问题显然存在一些争议。无论如何,微软已经做出了 C# 4 的决定(当然,C# 5 可以回归)。正如我所提到的,可选参数的一个特别好的用法是用于 COM 调用。请参阅有关该主题的 Wikipedia 部分以获取一个很好的示例:en.wikipedia.org/wiki/…
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以使用可变参数

      使用 params 关键字。

      void paramsExample(params int[] argsRest)
      {
      
       if(argsRest.Length == 2) then...
       else if(argsRest.Length == 4) then...
       else error...
      
      }
      

      【讨论】:

      • 我认为这不能回答我的问题。
      • 您可以接收可变参数。您检查数组是否有 2 个或 4 个元素。
      【解决方案5】:
      using System;
      using System.Runtime.InteropServices;
      
         public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
         {
            Console.WriteLine(s);
         }
      

      完成! :)

      【讨论】:

        【解决方案6】:

        你还不能这样做。我认为是feature of C# 4.0

        您可以使用 params 作为解决方法,但这只能按顺序使用,而不是某些语言处理默认参数的方式。

        【讨论】:

          【解决方案7】:

          你使用这样的重载

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

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

          Test(int[] ps)
          

          然后处理数据。

          解决这个问题的另一种方法是不使用重载/可选参数,而是根据它们要做什么来命名方法——这似乎是一个糟糕的权衡,但你的代码可能会更容易阅读。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-16
            • 1970-01-01
            • 2019-03-08
            • 2020-02-25
            • 2012-09-25
            • 1970-01-01
            相关资源
            最近更新 更多