在c#中,空的return语句在哪里开头?

本文关键字:语句 在哪里 开头 return 空的 | 更新日期: 2023-09-27 17:50:05

对于下面的代码,两个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;
    }
}
}

在c#中,空的return语句在哪里开头?

return关键字返回函数之外的控制(不管您在多少嵌套作用域中)。这种"纾困"方式是早期回报被视为不良做法的原因之一。基本上,你的程序是这样的:

  1. 30
  2. 呼叫设置器
  3. value> 0,跳过{}
  4. 中的内容
  5. 设置backbackfield为30
  6. 打印属性(仍为30)
  7. 带-1的呼叫设置器
  8. 价值& lt;0,执行{}
  9. 中的内容
  10. 返回,函数执行停止并返回到调用者
  11. 打印属性(仍然为30,因为没有设置)

如果你在setter中进行验证,抛出异常是更好的方法。

返回语句在设置age值之前退出属性设置器。不返回任何东西,因为setter类似于void方法。看起来你不想设置一个小于0的年龄,这是有道理的。

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

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

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

除非你不想设置年龄,如果它小于0,你会想抛出一个异常:

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

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;
  }
}