1、封装
封装可以隐藏实现的细节,让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在这些方法中增加逻辑控制,限制对数据的不合理访问。方便数据检查,有利于于保护对象信息的完整性。便于修改,提高代码的可维护性。实现良好的封装,需要从两个方面考虑:
- 把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问
- 把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作
所以,封装的含义是确保对用户隐藏敏感数据。为此,必须:
- 将类变量/属性声明为
private
- 提供公共的get和set方法来访问和更新
private
变量的值
2、get和set访问器
文档:C# 修饰符
private
变量只能在同一类中访问(外部类无法访问它)。 但是,如果我们提供公共的get和set访问器,get 访问器和 set 访问器的使用与方法非常类似,则可以访问它们。
get和set访问器,获取和设置字段(属性)的值。
定义属性的语法形式如下:
public 数据类型 属性名
{
get
{
获取属性的语句块;
return 值;
}
set
{
设置属性得到语句块;
}
}
例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cjavapy { class Book { private int id; private string name; private double price; //设置图书编号属性 public int Id { get { return id; } set { id = value; } } //设置图书名称属性 public string Name { get { return name; } } //设置图书价格属性 public double Price { get { return price; } set { price = value; } } public static void Main(string[] args) { // 创建Student类的一个对象(从Person继承属性和方法) Book myObj = new Book(); myObj.Id = 101; //只有get访问器,是只读的,只读不能赋值 //myObj.Name = "hello world!"; myObj.name="hello world!"; myObj.Price = 11.04; Console.WriteLine("Id: " + myObj.Id); Console.WriteLine("Name: " + myObj.Name); Console.WriteLine("Price: " + myObj.Price); } } }
get 访问器或 set 访问器还可以简写:
public 数据类型 属性名
{
get;
set;
}
例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cjavapy { class Book { //private int id; private string name; //private double price; //设置图书编号属性 public int Id { get; set; } //设置图书名称属性 public string Name { get { return name; } } //设置图书价格属性 public double Price { get; set; } public static void Main(string[] args) { // 创建Student类的一个对象(从Person继承属性和方法) Book myObj = new Book(); myObj.Id = 101; //只读不能赋值 //myObj.Name = "hello world!"; myObj.name="hello world!"; myObj.Price = 11.04; Console.WriteLine("Id: " + myObj.Id); Console.WriteLine("Name: " + myObj.Name); Console.WriteLine("Price: " + myObj.Price); } } }// 输出 "cjavapy"
3、封装的好处
- 更好地控制类的属性和方法
- 可以将类属性设置为只读(如果仅使用get访问器),也可以设置为只写(如果仅使用set访问器)
- 灵活:程序员可以更改代码的一部分而不影响其他部分
- 增强数据安全性