C# 使用 Missing.Value 和在方法调用中省略可选参数之间的区别?

C# Difference between using Missing.Value and just leaving out the optional parameter from method call?

因此,经过大量搜索,我发现了很多关于 Missing.Value 将默认值传递给可选参数的信息。

但不知何故,没有人提及为什么它比完全省略可选参数更有用,在这种情况下,它也获得了默认值。

在 Ms Office 互操作代码示例中遇到过它,但尝试将其排除在外,并且一切正常,正如预期的那样,那么,是什么原因呢?

例如在 :

oWB = oXL.Workbooks.Add( Missing.Value );

oWB = oExcel.Workbooks.Add();

只是为了用不同的例子阐明 Optional/Named 参数的好处,因为 oWB = oXL.Workbooks.Add( Missing.Value ); 已经共享。

Missing.Value

(From Remarks) Use this instance of the Missing class to represent missing values, for example, when you invoke methods that have default parameter values.

示例来自 Missing Class

    public class MissingClass
    {
        public static void MethodWithDefault(int value = 33)
        {
            Console.WriteLine("value = {0}", value);
        } 
    }

public class Example
{
   public static void Main()
   {
      // Invoke without reflection
      MissingClass.MethodWithDefault();

      // Invoke by using reflection.
      Type t = typeof(MissingClass);
      MethodInfo mi = t.GetMethod("MethodWithDefault");
      mi.Invoke(null, new object[] { Missing.Value });
   }
}
// The example displays the following output:
//       value = 33  
//       value = 33  

可选参数,请参见以下示例,如果此方法的调用者 (GetBillingInfo) 未提供这些参数的值,则提供给参数的默认值将被使用

您将可以通过 4 种方式调用您的方法

GetBillingInfo();//No parametes (kValue,quoteID)
GetBillingInfo("kvalue"); // KValue
GetBillingInfo("KValue" , 20); // kvalue + quoteID

你可以用paramName(命名参数)来调用它

GetBillingInfo(quoteID: 20) //quoteID

阅读Named and Optional Arguments (C# Programming Guide)

你的困惑是有根据的。在这个时代, Missing.Value 没有实际用处。但在 C# 4.0 之前的黑暗时代(我想是 2010 年?),可选参数还不是 C# 语言的一个特性。

这意味着如果您想使用依赖于可选参数并公开大量此类参数的 COM Interop 接口 - Office 互操作就是一个主要示例,您要么必须通过 Missing.Value您不想要的每个参数(超过 15 个,对于某些调用!)或使用 VB.NET 围绕 COM 调用编写包装器。 VB.NET 明确设计用于支持这种 COM 互操作,因为它是之前 VB 的常见用途。

但是今天呢?只需删除可选参数。

可以在相关问题的这个旧答案中找到更多信息: