C#属性必需和命名参数

时间:2014-03-09 12:08:52

标签: c# attributes naming-conventions optional-parameters

我正在创建C#自定义属性,我想传递一些参数。我有4个参数,其中一个是可选的。正如我所发现的,必须将可选参数设置为命名参数,而必需参数是位置参数。

如果我以这样的方式编写代码,我希望所有参数都用作命名(对我来说看起来更干净),该怎么办?是否应该始终定位所需的参数,并且该区分形式是可选的?这是什么最佳做法?

这是我的代码:

[AttributeUsage(AttributeTargets.Field)]
public class MyAttribute : Attribute
{
    private string _field1 = null;
    private string _field2 = null;
    private string _field3 = null;
    private string _field4 = null;

    public MyAttribute(string Field1, string Field2, string Field3)
    {
        _field1 = Field1;
        _field2 = Field2;
        _field3 = Field3;
    }

    public string Field4
    {
        get { return _field4; }
        set { _field4 = value; }
    }        
}

2 个答案:

答案 0 :(得分:1)

可选参数应位于参数列表的 end (以及后面的任何后续参数也应该是可选的),例如:

public MyAttribute(string Field1, string Field2, string Field3, string Field4 = "")
{
}

在该声明中,它是最后一个可选参数,除此之外的任何参数也必须是可选的。这在MSDN

的引用中突出显示
  

可选参数在任何必需参数之后在参数列表的末尾定义。如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。不支持参数列表中以逗号分隔的间隙。例如,在以下代码中,实例方法ExampleMethod定义了一个必需参数和两个可选参数。

答案 1 :(得分:1)

我想先发表评论澄清,但我的声誉不允许我这样做。 :(哈哈

首先,让我澄清一下你的命名参数的概念是什么?你提到“正如我发现的那样,必须将可选参数设置为命名参数。”因为如果您引用docs则不会。命名参数仅适用于方法的调用者,以指定哪个值不依赖于方法声明中参数的顺序。这是命名参数的用法:

public static void Main()
{
   Example e = new Example(height: 64, weight: 123);
}

public class Example
{
    int _weight;
    int _height;

    public CalculateBMI(int weight, int height)
    {
        _weight= weight;
        _height = height;
    }
}

命名参数的概念只是为了让你说出哪个是。

Example e = new Example(height: 64, weight: 123);

现在你的问题是“如果我以这样的方式编写代码,我希望所有参数都用作命名(对我来说看起来更干净)怎么办?”您不能强制方法让调用者调用该方法并指定所有参数的名称。这不是命名参数的概念。

如果我误解了你就让我知道,我很乐意纠正我说的任何内容或添加细节。