C# 构造函数和属性赋值的区别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace On_Wednesday_17th_March
{
public class Person
{
private int age;
public int Age
{
get
{
return age;
}
set
{
if (value > 0 && value < 100)
{
age = value;
}
else
throw new Exception("Warning:The age is not between 0 and 100");
}
}
public Person()
{
}
public Person(int newAge)
{
age = newAge;
}

}
class Program
{
static void Main(string[] args)
{
Person person1 = new Person();
person1.Age = -10;
// 此时会抛出Exception;
Person person2 = new Person(-10);
//晕了,此时并没有丢出异常
/// 怎么会这样啊,希望高手指导下唉!
}
}
}

因为用属性赋值的时候有一个判断正整数的逻辑,如果超出范围就抛出异常。
这也是属性的一个作用:做访问器使用,可以过滤非法数据。

用构造函数赋值的时候直接对私有成员进行赋值,没有进行判断。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-15
new Person(-10);直接将-10赋给age字段,age类型为int允许为负
person1.Age = -10;会执行Age属性中的set的代码,显然它会检查范围,异常是 throw new Exception("Warning:The age is not between 0 and 100");抛出的

解决:
1.构造函数中改为对Age赋值,这样会检查范围
2.将age声明为uint类型,这只允许正值本回答被提问者采纳
第2个回答  2010-03-17
public Person(int newAge)
{
age = newAge;
}
//构造函数,直接对变量age赋值了,没有经过判断
//而person1.Age = -10;则走了属性的set方法,也就是经过了值的判断,所以会抛出异常
第3个回答  2010-03-17
public Person(int newAge)
{
age = newAge;
}

是对字段age赋值

而person1.Age = -10

是对属性Age赋值

age可以理解为局部变量
Age可以理解为公开变量
相似回答