【问题标题】:Named Parameters vs Optional Parameters命名参数与可选参数
【发布时间】:2015-03-04 23:18:57
【问题描述】:

可选参数在 C# 中并不是什么新鲜事,自 C# 5.0 发布以来我就知道这一点,但我刚刚发现了一些东西。当我为我的 MVC 模型(例如 Required 属性)使用数据注释时,我看到了这个:

所以我可以这样做:

[Required(ErrorMessage="Something"]

但是,当我使用可选参数创建自己的方法时:

void Test(String x = null, String y = null) {}

我可以通过这两种方式传递参数:

Test(x = "Test") OR Test(x: "Test")

Required 属性中,我总是必须使用=,如果我使用:,则会导致错误。 例如:

 Required(ErrorMessage:"Something") --> Compile time error

所以我看到的是,这些命名参数的创建方式与我已经知道的不同。而我的问题是如何为方法制作它们(如何在必需属性中创建此类命名参数)。

【问题讨论】:

    标签: c#


    【解决方案1】:

    属性有自己的语法。它对命名参数使用name=value 形式。

    对于不能使用该表单的常规方法,您只能使用name:value 表单。

    普通方法无法使用name=value 形式。编译器将无法判断您是尝试使用命名参数还是尝试将值分配给变量并将赋值用作参数值。

    【讨论】:

      【解决方案2】:

      尽管这个语法看起来像一个方法调用:

      [Required(ErrorMessage="Something")]
      

      属性是一个,而不是一个方法。您没有在上面的行中指定参数,而是在初始化一个属性。请参阅Attribute base class documentation 上的示例以了解我的意思。

      因此,指定属性的语法类似于 C# 的类初始化语法:

      new RequiredAttribute { ErrorMessage = "Something" };
      

      目前在 C# 中没有用于为方法指定命名参数的等效语法。

      【讨论】:

        【解决方案3】:

        如果你这样做:

        string y; 
        Test(y = "Test")
        

        您可以使用该语法调用函数。但要小心...y = "Test" 实际上是设置变量y,然后将其传递给函数!那里有一个副作用,这可能是不受欢迎的。此外,"Test" 被传递到 Test 函数的参数 x,而不是 y,因为它作为第一个参数传入。

        简而言之,在调用函数时应始终避免使用此语法,因为它不会按照您的预期进行。

        【讨论】:

          猜你喜欢
          • 2011-02-08
          • 1970-01-01
          • 2010-10-27
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          • 2018-08-11
          • 2011-03-04
          相关资源
          最近更新 更多