听起来非常基本,但我没有找到现有答案。对不起,如果它是重复的。
我过去从未使用太多断言,但我可能还没有理解它们背后的精神。建议或标准做法是在方法Remove()?
中编写类似下面的内容public class Model
{
public Model ParentModel {get; private set}
readonly List<Model> submodels = new List<Model>();
public Model AddSubmodel(Model m)
{
submodels.Add(m);
m.ParentModel = this;
}
public void RemoveSubmodel(Model m)
{
submodel.Remove(m);
m.ParentModel = null;
}
public void Remove()
{
Debug.Assert(ParentModel != null);
if (ParentModel != null) ParentModel.RemoveSubmodel(this);
}
// ...
}
条件是我可以控制的(即它不依赖于用户交互或其他东西)并且它确定了我的代码的正确性,因此异常就出来了。
我的理由是,我希望它在调试模式下失败,但我想在发布模式下尽可能地修复它。
编辑,如评论中已经提到的那样,
违规行为不是非常致命的。如果没有父节点,除了没有空检查的方法调用失败之外,什么都不会发生(在发布版本中)。
但更重要的是,它表明Model类的客户端正在做一些不合逻辑的事情。 我想指出一个事实(至少在调试期间)我的客户端代码中有一些我显然没有想过的东西,因为如果我有,那么这种情况就不会发生。