【问题标题】:C# Difference between using Missing.Value and just leaving out the optional parameter from method call?C# 使用 Missing.Value 与仅从方法调用中省略可选参数之间的区别?
【发布时间】:2018-01-14 12:43:37
【问题描述】:

所以,经过广泛搜索,我发现了很多关于 Missing.Value 将默认值传递给可选参数的信息。

但不知何故,没有提及为什么它更有用,而只是省略了可选参数,在这种情况下,它也得到了它的默认值。

在 Ms Office 互操作代码示例中遇到它,但尝试将其省略,并且工作方式完全一样,正如预期的那样,那么,是什么?

例如在:

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

oWB = oExcel.Workbooks.Add();

【问题讨论】:

  • 如果方法有很多可选参数,你可以使用它来跳过特定的。
  • AFAIK,COM 接口不支持命名参数。如果您有多个可选参数,并且想要跳过一两个并传递后面的参数,则需要传递 Missing.Value 作为要跳过的参数。

标签: c# optional-parameters


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    缺失值

    (来自备注)使用 Missing 类的这个实例来表示缺失值,例如,当您调用具有默认参数值的方法时。

    来自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)

    【讨论】:

    • 只是根据问题详细信息not a single mention about why is it more useful, than just leaving out the optional parameter alltogether in which case, it also gets it's default value 让 OP 了解可选/命名参数
    • 我从没想过在 com Interop 之外使用 Missing.Value。直到现在我才看到您的评论,我才想回信说使用 Missing.Value 是为了处理 Com Interop,但我想我最好先检查一下 - 好像我错了。 Missing.Value 的文档无论如何都不会将其限制为 com 互操作。事实上,它有一个 .net 框架代码示例。所以首先 - 谢谢。我永远不会猜到这一点,其次,这使您的答案处于更好的环境中。看来我的第一条评论是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多