封装
封装的定义
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。举个例子,比如洗衣机各个组件被封装起来,只能通过按钮来操作它们,这种隐藏内部实现,对外提供操作接口的方式,我们称之为封装。
封装的好处
封装可以让使用者不用担心对象内部具体实现,同时又可以确保使用者无法更改内部代码。它可以让代码更易于理解和维护,也加强了代码的安全性。
定义属性
如何定义属性?
C#中属性的作用是提供灵活的机制来读写私有字段的值。C#中属性就是对字段的封装,通过对字段的封装,可以阻止不合法数据的录入,从而保护内部数据的安全,提高字段访问的安全性和灵活性。
C#中的属性结合了字段和方法的优点,对于对象的使用者,调用属性的方式和调用字段的方式相同;
对于类的使用者,属性是两个类似于方法的代码块,分别是get访问器(访问)和set访问器(赋值)。
为什么要使用属性?
在代码中直接对类进行访问,存在很大的缺陷,无法保证数据的合理性,此时我们可以使用属性对字段进行封装。
我们可以举个例子来让大家看一下。
新建一个控制台应用程序,然后添加一个Customer类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FengZhuang
{
public class Customer //publc设置为公开的类
{
public string name; //定义姓名
public int age; //定义年龄
public string address; //定义地址
}
}
然后在Program类里面实例化一个customer对象,并对Customer类的字段进行赋值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FengZhuang
{
public class Program
{
static void Main(string[] args)
{
Customer customer = new Customer(); //实例化一个customer对象
customer.name = "张三";
customer.age = 200;
customer.address = "北京";
//打印客户信息
Console.WriteLine("客户信息:");
Console.WriteLine("姓名:" + customer.name);
Console.WriteLine("年龄:" + customer.age+"岁");
Console.WriteLine("地址:" + customer.address);
}
}
}
运行结果如图所示,年龄为200岁,这样的数据显然是不合理的。
所以当我们直接对一个类中的字段进行直接访问时,就会存在这一问题。如何避免这样不合理的数据录入?可以使用属性对这样的字段进行封装。
使用属性进行封装的步骤?
1、私有化字段
2、定义属性,并题库set get访问器对字段进行访问
3、在set get访问器中添加代码保证数据的安全
如何使用属性?
下面通过一个案例来演示一下如何在程序中使用属性。
新建一个Customer类
namespace FengZhuang
{
public class Customer //publc设置为公开的类
{
public string name; //定义姓名字段
private int age; //定义年龄字段
//字段首字母小写,属性首字母大写
//封装快捷键:选中需要封装的字段,然后按Ctrl+R+E
public int Age //定义Age属性
{
get //get访问器用来获取字段的值
{
return age;
}
set //set访问器,对当前字段进行赋值
{
//限定age的值
if (value >=0 && value <=110)
{
age = value;
}
else
{
Console.WriteLine("年龄输入有误,默认设置为18岁");
age = 18;
}
}
}
public string address; //定义地址字段
}
}
在Program类中代码如下:
namespace FengZhuang
{
public class Program
{
static void Main(string[] args)
{
Customer customer = new Customer(); //实例化一个customer对象
customer.name = "张三";
customer.Age = 200; //age字段被私有化,只能通过Age属性进行访问
customer.address = "北京";
//打印客户信息
Console.WriteLine("客户信息:");
Console.WriteLine("姓名:" + customer.name);
Console.WriteLine("年龄:" + customer.Age+"岁");
Console.WriteLine("地址:" + customer.address);
}
}
}
此时,结果如图所示:当我们输入不合理的年龄200时,年龄被自动改成18岁,很好地避免了不合理数据的出现。
属性的分类:
通过提供不同的访问器,可以将属性分为以下3类:
1、只读属性:只含get访问器
2、只写属性:只含set访问器
3、读写属性:包含get访问器和set访问器
下面通过一个案例来演示不同类型的属性的定义和使用。
只写属性:set
当对数据进行读取时,会报错,缺少get(读取)访问器。
只读属性:get
当对数据进行赋值时,会报错,缺少set(赋值)访问器。