gpt4 book ai didi

C# .Net 4.0 命名参数和默认参数

转载 作者:行者123 更新时间:2023-11-30 14:44:16 25 4
gpt4 key购买 nike

您认为命名参数和默认参数将在 C#.Net 4.0 中增加什么值(value)?

这些有什么好的用途(尚未通过重载和覆盖实现)?

最佳答案

它可以使构造函数更简单,尤其是对于不可变类型(这对线程很重要)- see here for a full discussion .可能没有应该的好,但比有很多重载要好。您显然不能对不可变对象(immutable对象)使用对象初始值设定项,因此通常:

new Foo {Id = 25, Name = "Fred"}

不可用;我会满足于:

new Foo (Id: 25, Name: "Fred")

这可以扩展到简化重载的一般想法,但在大多数情况下,我更喜欢宣传合法组合的重载。 IMO,构造函数有点不同,因为您只是(通常)定义初始状态。

COM 方面的事情对很多人来说也很重要,但我只是没有使用太多 COM 互操作 - 所以这对我来说不是重要的。


编辑评论;他们为什么不使用与属性相同的语法呢?简单 - 它可能与其他成员/变量不明确(这不是属性的问题);举个例子:

[XmlElement("foo", Namespace = "bar")]

它使用一个常规参数(给构造函数“foo”)和一个命名赋值。因此,假设我们将其用于常规命名参数:

SomeMethod("foo", SecondArg = "bar");

(也可以是一个构造函数;为了简单起见,我使用了一个方法)

现在...如果我们有一个名为 SecondArg 的变量或属性怎么办?这在使用 SecondArg 作为 SomeMethod 的命名参数和将“bar”分配给 SecondArg 并传递“bar”之间会产生歧义"作为常规参数

为了说明,这在 C# 3.0 中是合法的:

    static void SomeMethod(string x, string y) { }
static void Main()
{
string SecondArg;
SomeMethod("foo", SecondArg = "bar");
}

显然,SecondArg 可以是属性、字段、变量等...

替代语法没有这种歧义。


编辑 - 280Z28 的这一部分:很抱歉在这里添加这个,但这并不是一个真正独特的答案,而且它对于评论和包含代码来说太长了。您暗示了歧义,但您的示例并未突出决定性案例。我认为您提供的示例指出了一些可能令人困惑的地方,但围绕对象初始值设定项所需的 {} 可防止潜在的语法歧义。我对以下代码的解释嵌入为多行 block 注释。

[AttributeUsage(AttributeTargets.Class)]
public sealed class SomeAttribute : Attribute
{
public SomeAttribute() { }

public SomeAttribute(int SomeVariable)
{
this.SomeVariable = SomeVariable;
}

public int SomeVariable
{
get;
set;
}
}

/* Here's the true ambiguity: When you add an attribute, and only in this case
* there would be no way without a new syntax to use named arguments with attributes.
* This is a particular problem because attributes are a prime candidate for
* constructor simplification for immutable data types.
*/

// This calls the constructor with 1 arg
[Some(SomeVariable: 3)]
// This calls the constructor with 0 args, followed by setting a property
[Some(SomeVariable = 3)]
public class SomeClass
{
}

关于C# .Net 4.0 命名参数和默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com