我可以安全地回复"从我的构造函数,如果我的参数有默认值?

时间:2018-02-27 18:46:06

标签: c# constructor properties

我有一个个人的项目,实际上是一个小型的演化模拟器"。此模拟器具有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的统计数据。

问题是:

  1. 如果我对所有属性使用默认参数,则会 从构造函数返回过早地用这些属性填充这些属性 默认值,或者它们会返回null,就好像它们没有 默认?
  2. 是否有一个特殊原因我使用return来逃避这样的构造函数?

3 个答案:

答案 0 :(得分:2)

总结:

  1. 从构造函数中提前返回是完全安全的,并且会导致字段具有默认值。

  2. 你没有真正的理由让你不使用return来逃避你的构造函数,因为替代方法通常会有很多混乱的if / else块更难以阅读。

  3. 如果您想了解更多信息,可以访问Microsoft's site about C# constructors

答案 1 :(得分:1)

属性或字段初始值设定项在构造函数运行之前(您的代码中)分配它们的值。

在此之后{p> return并没有改变任何事情。

答案 2 :(得分:1)

C#保证所有实例字段在构造函数运行之前都具有默认值。该语言允许您在构造函数中随时return

我的规则是构造函数不应该返回无效或不完整状态的实例;如果默认值(如null)无效,则在为该字段分配有效值之前,构造函数不可能返回。