代码之家  ›  专栏  ›  技术社区  ›  Mamta D

这两个参数中哪一个是正确的术语:命名参数还是命名参数?

c#
  •  5
  • Mamta D  · 技术社区  · 14 年前

    对于C 4.0,这两个术语中的哪一个是正确的术语:命名参数还是命名参数?我发现这两个术语出现了很多次,因此我很困惑如何提及它们(比如在正式文档中)?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Marc Gravell    14 年前

    参数具有 总是 已命名;在为方法提供值的上下文中,它们是 论据 -但是,您指定的名称是 参数 姓名。所以我可以看到它是如何混合的;p但是在上下文中,我们为编译器提供了to-name来解析 论点 ,所以“命名参数”ftw。

    更具体地说:

    7.5.1参数列表

    论点 有一个 参数名称 被称为 命名参数 ,鉴于 论点 没有 参数名称 是一个 位置参数 . 位置参数出现在 参数列表 .

        2
  •  1
  •   cdhowie    14 年前

    MS本身 refers to them as "named arguments" . 他们创造了语言;我会坚持他们使用的语言。

    (除非有人在msdn上找到在c_上下文中引用“命名参数”的内容。

    编辑: 有人做到了。使用任何你想要的地狱术语。:)

        3
  •  1
  •   jordanbtucker    14 年前

    我已经看到它们可以互换使用,但是我喜欢在定义中使用参数,在传递的值中使用参数。例如,下面的类有一个“类型参数”:

    class A<T> { }
    

    但是下面的声明有一个“类型参数”:

    var a = new A<string>();
    

    引用C 4规范:

    由于类型参数可以用许多不同的实际类型参数进行实例化,因此类型参数的操作和限制与其他类型稍有不同。

    另一个引用:

    带默认参数的固定参数称为可选参数,而不带默认参数的固定参数是必需参数。

    C规范引用“命名参数”的唯一时间(afaiknew)是关于 Attributes . 但是当提到新特性时,他们使用“命名参数”。所以,我会遵循这个模式。

    更新

    Marc有一个很好的观点,参数总是被命名的,但这并不意味着参数现在也可以被命名。该名称仍属于参数,并向其提供了参数。使用新的“命名参数”功能,提供参数可能有两个部分:参数本身和 参数的名称 它正在供应给。

    // The part before the : is the named parameter,
    // and the part after the : is the argument
    SomeMethod(someParam: someArg);
    

    我知道这是一派胡言,但我仍然认为这是一个正确的观点。据我所知,您将了解是使用“命名参数”还是“命名参数”。(另外,第7.5.1节仍然在瞪着我。)

        4
  •  0
  •   Joacim Andersson    14 年前

    在我个人看来,我认为7.5.1是向后的,7.5.1.1也证实了这一点,其中规定:

    如果找不到唯一的参数列表,则构造一个名称不可访问且没有可选参数的参数列表,这样调用就不能使用命名参数或省略可选参数。

    在调用中,命名应接受传递给它的参数的参数。

    public static void SayHello(string name = "John Doe", int age = 30)
    {
      Console.WriteLine("Hello {0}, I see you're {1} years old.", name, age);
    }
    
    static void Main(string[] args)
    {
      SayHello(age:42);
    }
    

    在main中,我没有向“name”参数传递任何参数,也不需要传递任何参数,因为它有一个使参数可选的默认值(参数不是可选的,因为它显然存在于sayhello函数中)。但是,我已经指定参数42应该传递给“age”参数(换句话说,我已经在调用中命名了该参数)。如果我能命名这些参数,我就可以给它们任意命名:

    再见(语言:“vfred”,版本:7);

    我看到允许“命名参数”的唯一原因是,如果我使用的API不使用方法参数的描述性名称。然后至少我可以在调用者站点命名这些参数,这样它就有意义了。但是,遗憾的是,C不允许您为参数提供任何名称,但是它允许您指定应该接受参数的参数的名称。

    如果你不认为参数和参数是可互换的,而是参数是调用站点上的列表,而参数是调用方站点上的,这至少是C++如何定义的,那么这种推理是唯一有效的。