我有一个个人的项目,实际上是一个小型的演化模拟器"。此模拟器具有Critter
类型的对象。 Critter
的属性都有默认值,即:
public Rules.Size Size { get; set; } = Rules.Size.Medium; //average size
该类有多个构造函数。其中一个构造函数接受两个父母" Critter
并确定他们是否可以成功创建新物种Critter
if (c1.Species != c2.Species) //compare guids
throw new Exception("Cannot combine critters of type " + c1.Species.ToString() + " and " + c2.Species.ToString());
//check to see if breeding happens.
var chance = c1.ChanceToReproduce + c2.ChanceToReproduce / 2;
var reality = new Random().Next(0, 100) / 100;
//if the random "rolls under", success
if (chance > reality)
return; // no result. Is this a bad practice in a constructor?
最后一点是我不确定我是否养成了坏习惯。通常,您无法从构造函数返回值,但我不是。我经常使用它来摆脱void
方法,但在构造函数中,它让我想知道我是否在某个地方犯了错误。但我知道它是有效的代码。这里的目标是不填写从未有过的Critter
的统计数据。
问题是:
null
,就好像它们没有
默认?return
来逃避这样的构造函数?答案 0 :(得分:2)
总结:
从构造函数中提前返回是完全安全的,并且会导致字段具有默认值。
你没有真正的理由让你不使用return来逃避你的构造函数,因为替代方法通常会有很多混乱的if / else块更难以阅读。
如果您想了解更多信息,可以访问Microsoft's site about C# constructors
答案 1 :(得分:1)
属性或字段初始值设定项在构造函数运行之前(您的代码中)分配它们的值。
在此之后{p>return
并没有改变任何事情。
答案 2 :(得分:1)
C#保证所有实例字段在构造函数运行之前都具有默认值。该语言允许您在构造函数中随时return
。
我的规则是构造函数不应该返回无效或不完整状态的实例;如果默认值(如null
)无效,则在为该字段分配有效值之前,构造函数不可能返回。