c#属性要求和命名参数

本文关键字:参数 求和 属性 | 更新日期: 2023-09-27 17:49:19

我正在创建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; }
    }        
}

c#属性要求和命名参数

可选参数应该位于参数列表的末尾(之后的任何参数也应该是可选的),例如:

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

在该声明中,它是最后一个可选参数,它之后的任何参数也必须是可选的。这在MSDN的引用中突出显示:

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

我想先评论澄清一下,但是我的名声不允许我这么做。(哈哈

首先,让我澄清你的命名参数的概念是什么?您提到"正如我所发现的,可选参数必须设置为命名参数。"因为如果你参考文档,它不会。命名参数仅供方法调用者指定哪个值是哪个值,而不依赖于方法声明中参数的顺序。下面是命名参数的用法:

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);

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

如果我误解了你,请告诉我,我很乐意纠正我所说的任何东西或补充细节。