C# 如何使用返回类型为特定条件添加断言
我的代码中有类似的东西。现在假设该方法返回一个枚举类型。 但是,并非所有代码路径都返回值。我想解决这个问题,同时我希望调试器提醒我(即)断言,如果枚举类型进入else(代码中的第三个条件),则不会返回任何枚举类型。通常,我会为else条件添加另一个枚举类型并检查返回值,但我想知道是否有更好的方法C# 如何使用返回类型为特定条件添加断言,c#,C#,我的代码中有类似的东西。现在假设该方法返回一个枚举类型。 但是,并非所有代码路径都返回值。我想解决这个问题,同时我希望调试器提醒我(即)断言,如果枚举类型进入else(代码中的第三个条件),则不会返回任何枚举类型。通常,我会为else条件添加另一个枚举类型并检查返回值,但我想知道是否有更好的方法 private enumType AdjustType(someo_object q) { if(q.val.Equals("M"))
private enumType AdjustType(someo_object q)
{
if(q.val.Equals("M"))
{
return enumType.FirstType;
}
else if (q.val.Equals("N"))
{
return enumType.SecondType;
}
else
{
return null; //This isnt allowed - I would like something like an assertion here
}
}
您可以始终使用枚举的可空版本:
private enumType? AdjustType(someo_object q)
您可以始终使用枚举的可空版本:
private enumType? AdjustType(someo_object q)
我会抛出
ArgumentException
——可能通过一个开关来实现:
private enumType AdjustType(someo_object q)
{
switch (q.val)
{
case "M": return enumType.FirstType;
case "N": return enumType.SecondType;
default : throw new ArgumentException(...);
}
}
我个人更喜欢使用Debug.Assert
——在这里您无论如何都必须返回一些东西,然后在发布版本中关闭断言时错误可能会传播
另一种选择是只拥有一本
字典
——你可能很乐意让它传播。(这取决于您的上下文。)我只会抛出ArgumentException
——可能通过一个开关来实现:
private enumType AdjustType(someo_object q)
{
switch (q.val)
{
case "M": return enumType.FirstType;
case "N": return enumType.SecondType;
default : throw new ArgumentException(...);
}
}
我个人更喜欢使用Debug.Assert
——在这里您无论如何都必须返回一些东西,然后在发布版本中关闭断言时错误可能会传播
另一种选择是只拥有一本
字典
——你可能很乐意让它传播。(这取决于您的上下文。)您有几个选项:
None
值添加到枚举并返回:
public enum MyEnum
{
None = 0,
First,
Second
}
如果传入参数的值对方法永远无效,则应在方法开头检查这些值,并在值无效时抛出
ArgumentException
或其派生类之一。然后,您可以在方法的其余部分假设传入的值是有效的,这使代码更干净。这就是我编写此类方法的方式:
private MyEnum AdjustType(object q)
{
#region Contract
if (q == null)
throw new ArgumentNullException("q");
if (q.Value != "M" && q.Value != "N")
throw new ArgumentException("Value must be M or N.", "q");
#endregion
// Here all incoming arguments are valid and within range.
// ...
}
您有几个选择:
None
值添加到枚举并返回:
public enum MyEnum
{
None = 0,
First,
Second
}
如果传入参数的值对方法永远无效,则应在方法开头检查这些值,并在值无效时抛出
ArgumentException
或其派生类之一。然后,您可以在方法的其余部分假设传入的值是有效的,这使代码更干净。这就是我编写此类方法的方式:
private MyEnum AdjustType(object q)
{
#region Contract
if (q == null)
throw new ArgumentNullException("q");
if (q.Value != "M" && q.Value != "N")
throw new ArgumentException("Value must be M or N.", "q");
#endregion
// Here all incoming arguments are valid and within range.
// ...
}
或者使用f#选项类型:或者使用f#选项类型:根据字典的建议,您不妨全力以赴,将枚举设为字符枚举,然后将坏男孩解析为枚举类型。:)根据字典的建议,您不妨全力以赴,将枚举设为Char的枚举,然后将bad boy解析为enumType.:)