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;
}
}
我创建了这个简单的例子来说明我的意思。
C#构造函数可以调用自己的Getter / Setter属性吗?如果Name为null,则抛出ArgumentNullException。
如果不建议从构造函数中调用setter属性,那么如何在构造函数中实现异常以确保name字段不为空?或换句话说,如果我说Planet myPlanet = new Planet(null,“9999999”,“Milky Way”);如果我以这种方式创建对象,如何确保抛出异常?
答案 0 :(得分:3)
是的,没关系。
调用setter的任何代码都会抛出异常。您也可以使用初始化程序设置它,而不是在构造函数中设置属性:
// 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; }