我正在创建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; }
}
}
答案 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);
现在你的问题是“如果我以这样的方式编写代码,我希望所有参数都用作命名(对我来说看起来更干净)怎么办?”您不能强制方法让调用者调用该方法并指定所有参数的名称。这不是命名参数的概念。
如果我误解了你就让我知道,我很乐意纠正我说的任何内容或添加细节。