构造函数和属性

时间:2012-09-22 16:25:12

标签: c# exception properties

public Planet(string planetName,string planetLocation,string distance)
{
    //Is this okay to do in C#?
    Name = planetName;
    this.planetLocation = planetLocation;
    this.galaxy = galaxy;

    // etc.
}

public String Name
{
    get
    {
        return planetName;
    }
    set
    {
        if (value == null)
        {
            throw new ArgumentNullException("Name cannot be Null");
        }

        this.planetName = value;
    }
}

我创建了这个简单的例子来说明我的意思。

  1. C#构造函数可以调用自己的Getter / Setter属性吗?如果Name为null,则抛出ArgumentNullException。

  2. 如果不建议从构造函数中调用setter属性,那么如何在构造函数中实现异常以确保name字段不为空?或换句话说,如果我说Planet myPlanet = new Planet(null,“9999999”,“Milky Way”);如果我以这种方式创建对象,如何确保抛出异常?

3 个答案:

答案 0 :(得分:3)

  1. 是的,没关系。

  2. 调用setter的任何代码都会抛出异常。您也可以使用初始化程序设置它,而不是在构造函数中设置属性:

  3. // Will also throw
    var planet = new Planet("999999","Milky Way"){ Name = null };

答案 1 :(得分:2)

1) 我不知道在构造函数中调用属性是否很常见,但为什么不这样做呢? 我个人直接在我的构造函数中调用所有变量。

2) 您可以在构造函数中执行此操作:

if(planetname == null)
    throw new ArgumentNullException("bla");
this.planetname = planetname;

因此,每次planetname等于null时,都会抛出ArgumentNullException。 如果不是null,则将值分配给planetname

public string Name
{
    get{ return name; }
    set
    {
        value != null ? name = value : throw new ArgumentNullException("Bla");
    }
}

这就是我这样做的方式。也许有帮助

答案 2 :(得分:1)

可以在代码中调用Set / Set属性,但是按照按合同设计,更好的方法是在构造函数中检查null:

public Planet(string planetName,string planetLocation,string distance) 
{ 
    if (string.IsNullOrEmpty(planetName))  
         throw new ArgumentNullException("Name cannot be Null"); 

    Name = planetName; 
    // More code lines
} 

public String Name {get; private set; }

P / S:IMO,在字段上使用属性的最佳做法,除非你真的需要,否则不要在属性中添加更多代码,只需保持简单,如下所示:

public String Name {get; private set; }