0
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"); 如果以这种方式创建对象,如何确保引发异常?

4

3 回答 3

3
  1. 是的,没关系。

  2. 任何调用 setter 的代码都会抛出异常。除了在构造函数中设置属性,您还可以使用初始化器设置它:

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

于 2012-09-22T16:30:00.933 回答
2

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

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

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

所以每次都planetname等于nullaArgumentNullException被抛出。如果不是,null则将该值分配给planetname.

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

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

于 2012-09-22T16:34:03.557 回答
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; }
于 2012-09-22T16:29:53.670 回答