对于下面的代码,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;
}
}
}
答案 0 :(得分:3)
return
关键字将控制权退出函数(无论您使用多少嵌套作用域)。这&#34;纾困&#34;方法是早期回报被认为是不良做法的一个原因。基本上,你的程序流程如下:
如果您在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;
}
}