C#中的属性和字段
类成员包括变量和方法。如果希望其他类能够访问成员变量的值,就必须定义成公有的,而将变量设为公有public,那这个成员变量的就可以被任意访问(包括修改,读取),这样不利于数据安全。
属性可以当作对字段的封装,字段内部使用,属性因为安全性高可以外部使用.属性比字段,多设了get和set属性
最初定义一个Person类,存在字段age
class Person { public int age; }
调用
Person person = new Person(); person.age = 1000; Console.WriteLine(person.age);
这时候发现人的年龄不可能是1000,并且由于age是public的任意地方都可以修改,这样很不安全,但是如果把age设置为private又无法进行调用,所以考虑使用方法封装一个这个字段
class Person { private int age; public int GetAge() { return age; } public void SetAge(int age) { if (age > 100) { //数据错误处理 } else { this.age = age; } } }
调用
Person person = new Person(); person.SetAge(90); Console.WriteLine(person.GetAge());
这样就实现了对字段的封装,取值使用Get方法,赋值使用Set方法
在C#中可以使用属性来解决这种问题
在属性get/set中加入逻辑判断
class Person { private int age; public int Age { get { return age; } set { if (value > 100) { throw new Exception("数据异常"); } else { age = value; } } } }
如果没有任何逻辑处理就可以使用自动实现的属性
class Person { public string Name { get; set; } }
等价于
private string name; public string Name { get { return name; } set { value = name; } }
使用访问修饰符或者通过省略get/set方法创建只读或只写属性
class Person { public string Name { get; private set; } public int Age { private get; set; } }
在 C# 6 和更高版本中,你可以像字段一样初始化自动实现属性
public string Name{ get; set; } = "Wang";