所需最小值为一个值的C#参数

所需最小值为一个值的C#参数,c#,params,C#,Params,有没有比我这里得到的更优雅的方法来确保总是使用至少一个值调用构造函数?我这样做是因为如果没有提供值,我希望编译器出现错误 public class MyClass { private readonly List<string> _things = new List<string>(); public string[] Things { get { return _things.ToArray(); } } public MyClass(strin

有没有比我这里得到的更优雅的方法来确保总是使用至少一个值调用构造函数?我这样做是因为如果没有提供值,我希望编译器出现错误

public class MyClass
{
    private readonly List<string> _things = new List<string>();
    public string[] Things { get { return _things.ToArray(); } }

    public MyClass(string thing, params string[] things)
    {
        _things.Add(thing);
        _things.AddRange(things);
    }
}
公共类MyClass
{
私有只读列表_things=new List();
public string[]Things{get{return_Things.ToArray();}
公共MyClass(字符串对象,参数字符串[]对象)
{
_事物。添加(事物);
_事物。添加范围(事物);
}
}
编辑

根据评论,我已经将代码更改为

public class Hypermedia : Attribute
{
    private readonly Rel[] _relations;
    public IEnumerable<Rel> Relations { get { return _relations; } }

    public Hypermedia(Rel relation, params Rel[] relations)
    {
        var list = new List<Rel> {relation};
        list.AddRange(relations);
        _relations = list.ToArray();
    }
}
公共类超媒体:属性
{
私有只读Rel[]\u关系;
公共IEnumerable关系{get{return\u Relations;}}
公共超媒体(Rel关系,params Rel[]关系)
{
var list=新列表{relation};
list.AddRange(关系);
_关系=list.ToArray();
}
}

很抱歉之前编辑代码试图隐藏我的意图。直接从我的代码编辑器粘贴更容易

我相信您正在寻找RequiredAttribute(从.NET 3.5开始提供)

有关更多信息,请参阅。

关于什么

代码契约包括用于标记代码的类、用于编译时分析的静态分析器和运行时分析器


至少您会从静态分析器得到警告。您可以在发布模式下关闭运行时分析,以避免性能受到影响。

调用方仍然可以将
null
作为
thing
传递。如果您正在寻找另一个添加项,请使用方法返回数组而不是属性,因为开发人员可以使用调用
.ToArray()的
x.Things.Count
执行循环
在每次迭代中。Reference:-“在以下情况下,请使用方法而不是属性。”在要点“操作返回数组”下。@AntonyScott每次都要小心返回相同的数组。如果返回实际对象引用,调用代码可以修改其内容;我怀疑这可能不可取<代码>x.Things[0]=“你好,世界!”相反,您可以考虑返回一些不可更改的枚举,用于<代码> .Wests<代码>属性,并存储<代码>计数>代码>作为<代码> Read Ong/Eng>常数,在构造函数中预先计算。不幸的是,这并不太好。调用代码可以将其强制转换回数组并更改值。也许可以考虑使用<代码> Furace和<代码>收益返回<代码>值(或返回迭代器)@反义斯科特,当然,我完全避免过工程代码,尤其是在内部使用时。一个真正快速的方法是让
foreach(事物中的var事物)产生收益。你是对的;从这个意义上讲,您的使用可能有点过头了。这不是用于表单/输入/数据库验证吗?知道这一点很有用,但不完全是我想要的。
public MyClass(params string[] things)
{
    Contract.Requires(things != null && things.Any());
    _things.AddRange(things);
}