封裝
封裝的定義
封裝,即隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行爲(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。舉個例子,比如洗衣機各個組件被封裝起來,只能通過按鈕來操作它們,這種隱藏內部實現,對外提供操作接口的方式,我們稱之爲封裝。
封裝的好處
封裝可以讓使用者不用擔心對象內部具體實現,同時又可以確保使用者無法更改內部代碼。它可以讓代碼更易於理解和維護,也加強了代碼的安全性。
定義屬性
如何定義屬性?
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(賦值)訪問器。