我知道网站上已经解决了这个问题。虽然,有许多不同的意见,我想更深入地了解如何面对某些特定的情况。 我们说我有以下代码。我会用C#编写,但它不是一个严格相关的C#问题。
class Player
{
private int dexterity;
public int Dexterity{
get => dexterity;
set{
//Here I need to validate: problem 2
dexterity = value;
UpdateArmorClass(); //Armor class should be modified any time dex is
}
private int armorClass;
public Player(int dex){
Dexterity = dex;
}
private void UpdateArmorClass(){
//Should I validate here? Problem 3
armorClass = 10 + Dexterity;
}
}
//Here is main with user input: problem 1
让我们说要求用户输入其敏捷性,必须是非负的,以创建其角色。现在我面临三种情况:
这是最后一种方法:
public float Hit(int armorClass){
if(armorClass >=0) //calculate probability of being hit
//return probability
}
奖金问题(当然与以前的问题有关):实例化一个新的异常真的那么贵吗?或者它只是尝试捕获部分?对我而言,它似乎是在实例化一个新对象,而这就是全部。虽然,我可能是错的,这就是为什么许多人说如果不是真的需要你就不应该使用例外。
答案 0 :(得分:2)
在这里,我面临着一个巨大的困境:是否使用例外? ID 个人使用它们来阻止程序生成无效 宾语。虽然,许多人不鼓励因使用异常而使用异常 价格昂贵。
使用例外。引发异常只是昂贵的,引发异常总是比最终损坏的对象更好。如果您的值来自用户输入,请分别从用户处获取无效值。这样,您可以安全地从代码中调用这些方法/设置值,并且在用户输入无效值时不会引发异常。另外,有时您可能希望使用特殊值,不允许用户输入。
问题3:
如果您的私有字段在设置之前始终经过验证,则无需检查其是否在get上有效。在您的代码示例中,将10
添加到任何非负数都将始终返回非负值。
奖金问题: 所有引发的异常都必须在某个地方处理,所以我认为如果它是一个昂贵的,或者是捕获部分的提升异常部分那么重要。