在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;
}
}
}
return
关键字返回函数之外的控制(不管您在多少嵌套作用域中)。这种"纾困"方式是早期回报被视为不良做法的原因之一。基本上,你的程序是这样的:
- 30 呼叫设置器
- value> 0,跳过{} 中的内容
- 设置backbackfield为30
- 打印属性(仍为30)
- 带-1的呼叫设置器
- 价值& lt;0,执行{} 中的内容
- 返回,函数执行停止并返回到调用者
- 打印属性(仍然为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;
}
}