C#中的空返回语句在哪里?

时间:2014-03-13 23:43:18

标签: c# .net return

对于下面的代码,WriteLine结果输出都是30。

我不知道为什么第二个结果也是30。

我认为如果值为-1,则程序会用完大括号{ return; },然后移到{}之后的下一行。

这是对的吗?

class Program
{
    static void Main(string[] args)
    {
        Person pp = new Person();
        pp.Age = 30;
        // Output is 30
        Console.WriteLine("the age is {0}", pp.Age);
        pp.Age = -1;
        // Output is 30 again
        Console.WriteLine("the age is {0}", pp.Age);

    }
}

class Person
{
    private int age;
    public int Age
{
    set
    {
        if (value < 0)
        {
            // An empty return statement
            return; 
        }

        // if the value is -1, does it go through this line?
        this.age = value; 

    }
    get
    {
        return this.age;
    }
}

}

4 个答案:

答案 0 :(得分:3)

return关键字将控制权退出函数(无论您使用多少嵌套作用域)。这&#34;纾困&#34;方法是早期回报被认为是不良做法的一个原因。基本上,你的程序流程如下:

  1. 使用30
  2. 调用setter
  3. 值&gt; 0,跳过{}
  4. 中的内容
  5. 将支持字段设置为30
  6. 打印属性(仍为30)
  7. 使用-1
  8. 调用setter
  9. 值&lt; 0,执行{}
  10. 中的内容
  11. 返回,函数执行停止并返回调用者
  12. 打印属性(因为没有设置,所以仍为30)
  13. 如果您在setter中进行验证,抛出异常是一种更好的方法。

答案 1 :(得分:2)

在设置年龄值之前,return语句退出属性setter。没有返回,因为setter就像一个void方法。看起来你不想设置一个小于0的年龄,这是有道理的。

有些应用决定在这种情况下抛出ArgumentException而不是默默地失败。

答案 2 :(得分:1)

如果值小于0,您的setter就会返回,因此当您尝试将其设置为-1时,永远不会设置年龄。二传手应该是:

public int Age {
    set { age = value; }
}

除非你想要设定年龄小于0,否则你会想要抛出异常:

public int Age {
    set {
        if (value < 0)
            throw new ArgumentException();

        age = value;
    }
}

答案 3 :(得分:1)

return会导致方法立即退出方法,而不仅仅是在{ }中留下范围。

在某些情况下,您希望退出范围,但不是方法。这是使用break完成的,但在循环中工作。

for (;;)
  if (condition)
    break; // breaks out of the loop

我认为你要做的是保护年龄免受负面价值的影响。我建议使用例外。

public int Age
{
  set
  {
    if (value < 0)
      throw new InvalidArgumentException("Age cannot be negative");
    age = value;
  }
  get
  {
    return age;
  }
}