1. 总结
如果没有使用以下属性的三大特点,可以简单理解属性和字段的功能一致。
数据封装: 可以在访问或修改数据时插入逻辑。
只读或只写属性: 可以通过只实现 get 或 set 访问器来创建只读或只写属性。
增强可维护性: 属性可以在不改变类的接口情况下修改内部实现。
具体例子请看标题3
2. 从一个问题开始
我不理解属性的概念,带上{ get;set; }就是属性吗,我看无论是取值还是修改,下面两个的功能都是一样的。
namespace Test
{
public class Test
{
public bool HaveProperty1 { get;set; }
public bool HaveProperty2;
}
public class Test2
{
public static void Main(string[] args)
{
var haveProperty1 = new Test().HaveProperty1;
var haveProperty2 = new Test().HaveProperty2;
}
}
}
3. 从一个回答结束
带有 get/set 的成员就是属性。
如果不利用属性的三个好处(数据封装、只读或只写属性、增强的可维护性),在基本的使用场景下,public string Name { get; set; } 和 public string Name; 看起来效果是一样的,因为它们都能公开一个字符串成员并允许读取和写入。
3.1 数据封装:
数据封装: 属性提供了对字段的封装,可以在访问或修改数据时插入逻辑。
public class Person
{
private string name; // 私有字段
public string Name // 属性
{
get { return name; } // 获取name的值
set
{
if (!string.IsNullOrEmpty(value))
{
name = value; // 设置name的值并进行验证
}
else
{
throw new ArgumentException("Name cannot be null or empty");
}
}
}
}
// 使用属性
var person = new Person();
person.Name = "Alice"; // 合法
// person.Name = ""; // 会抛出异常
3.2 读写属性
只读或只写属性: 可以通过只实现 get 或 set 访问器来创建只读或只写属性。
public class Person
{
private string name; // 私有字段
public string Name // 只读属性
{
get { return name; }
}
public Person(string name)
{
this.name = name;
}
}
// 使用只读属性
var person = new Person("Alice");
// person.Name = "Bob"; // 编译错误,无法设置只读属性
3.3 维护性
增强的可维护性: 属性可以在不改变类的接口情况下修改内部实现。
public class Person
{
private string name; // 私有字段
public string Name // 属性
{
get { return name; }
set { name = value; }
}
}
// 以后可以轻松添加逻辑,而不改变类的接口
public class Person
{
private string name; // 私有字段
public string Name // 属性
{
get { return name; }
set
{
if (!string.IsNullOrEmpty(value))
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty");
}
}
}
}