Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用返回类型为特定条件添加断言_C# - Fatal编程技术网

C# 如何使用返回类型为特定条件添加断言

C# 如何使用返回类型为特定条件添加断言,c#,C#,我的代码中有类似的东西。现在假设该方法返回一个枚举类型。 但是,并非所有代码路径都返回值。我想解决这个问题,同时我希望调试器提醒我(即)断言,如果枚举类型进入else(代码中的第三个条件),则不会返回任何枚举类型。通常,我会为else条件添加另一个枚举类型并检查返回值,但我想知道是否有更好的方法 private enumType AdjustType(someo_object q) { if(q.val.Equals("M"))

我的代码中有类似的东西。现在假设该方法返回一个枚举类型。 但是,并非所有代码路径都返回值。我想解决这个问题,同时我希望调试器提醒我(即)断言,如果枚举类型进入else(代码中的第三个条件),则不会返回任何枚举类型。通常,我会为else条件添加另一个枚举类型并检查返回值,但我想知道是否有更好的方法

        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
——在这里您无论如何都必须返回一些东西,然后在发布版本中关闭断言时错误可能会传播


另一种选择是只拥有一本
字典
——你可能很乐意让它传播。(这取决于您的上下文。)

您有几个选项:

  • 抛出异常。当您知道输入无效时(例如,由于调用代码中的错误),这是合适的

  • 使用可为空的类型。当操作没有有效结果时(例如,由于无效的用户输入或不是bug的情况),这是合适的

  • 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.
        // ...
    }
    

    您有几个选择:

  • 抛出异常。当您知道输入无效时(例如,由于调用代码中的错误),这是合适的

  • 使用可为空的类型。当操作没有有效结果时(例如,由于无效的用户输入或不是bug的情况),这是合适的

  • 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.:)