知識點:瞭解.NET 特性、 掌握.NET 框架結構組成和原理、掌握類和對象的概念、 掌握封裝的基本概念
參考複習資料:C#編程基礎第一課:C#和.NET框架、VS軟件基本使用、編寫第一個C#程序
1、 .NET 平臺概述
1.1 .NET 平臺的魅力
- 開發語言完全支持面向對象,有強大的類庫支持。
- 強大的 Web 應用開發支持,我們能使用 ASP.NET 等技術開發各種網站應用。如 Dell 公司的網站和國外非常流行的社交網站 MySpace 就是用 ASP.NET 開發的。
- 強大的 Web Service 支持,Web Wervice 是構建互聯網應用重要的技術,使用它可以輕鬆實現 各種應用程序間的網絡通信。攜程網站的後臺訂票系統就是 WebService 開發的。
- 支持 SOA 和雲計算,.NET 支持 SOA(Service-Oriented Architecture)面向服務架構,它可以根據需求通過網絡對鬆散耦合的粗粒度應用組件進行分佈式部署、組合和使用。同時支持雲計算, Windows Azure 就是微軟退出的雲計算開發平臺。
- WPF技術,WPF是微軟新一代圖形系統,運行在.NET Framework 3.0及以上版本,爲用戶界面、 2D/3D 圖形、文檔和媒體提供了統一的描述和操作方法。基於DirectX 9/10技術的WPF不僅帶來了前所未有的3D界面,而且其圖形向量渲染引擎也大大改進了傳統的2D界面,比如Windows 中的半透明效果的窗體等都得益於WPF。程序員在WPF的幫助下,要開發出媲美Mac程序的酷炫界面已不再是遙不可及的奢望。
2、 .NET 框架結構
2.1 CLR
- CTS(Common Type System): 由於.NET 支持多種語言,每種語言的數據類型都是不一樣的,通過通用類型系統可以解決數據類型不同的問題,如 C#中的 int 類型,在 VB 中是 Integer,CTS 把它們編譯成 Int32,所有語言通用這種類型。
- CLS(Common Language Specification): 編程語言除了數據類型外,語法也有很大區別。CLS 公共語言規範就規範了不同語言所必須遵循的最低規範,以保證語言的互操作性。如 C#命名是區分大小寫的,而 VB.NET 不區分,CLS 就規定編譯後的中間代碼命名除了大小寫還需要有別的區別。
簡單地說,CLR是CTS的實現,也就是說,CLR是應用程序的執行引擎和功能齊全的類庫,該類庫嚴格按照CTS規範實現。作爲程序執行引擎,CLR負責安全地載入和運行用戶程序代碼,包括對不用對象的垃圾回收和安全檢查。在CLR監控之下運行的代碼,稱爲託管代碼(managed code)。
2.2 FCL
3、 類和對象
- 將一組對象歸納爲類,將對象的共性抽取出來形成類的過程叫:抽象化。
- 在類的概念模型下,將狀態和行爲具體化爲實際對象的過程叫:實例化。
舉例理解:類和對象的關係
比如,我們想購買20臺電腦,在購買之前,會列出一個配置清單(CPU、內存、顯示器……),到店以後和銷售人員進行交流,確定配置清單。
- 那麼配置清單就可以看做是一個類,對象:20臺電腦
- 我們對類的更改,會影響到對象的更改,也就是通過類可以操作對象。比如,在配置清單(類)上,新增加一個或減少一個配件(屬性、方法),那麼會同時影響到20臺電腦(對象)。
- 但是20臺電腦是相互獨立的,互不影響,比如說電腦可以安裝不同的操作系統,也就是對象是相互獨立的,對其中一個對象進行操作,不會影響同類下的另一個對象。
3.1 類的聲明
- 類是一種數據結構,可以包含數據成員(常量和字段)、函數成員(方法、屬性、事件、索引器、運算符、實例構造函數、靜態構造函數和析構函數)以及嵌套類型。
- C#中一切類型都爲類,除(引用的命名空間外)所有的語句都必須位於類(或者結構)內,不存在任何處於類(或結構)之外的語句。因此,類是C#語言的核心和基本構成模塊。比如,默認代碼中包含一個Program類。
類定義的具體語法形式如下:
類的訪問修飾符 修飾符 類名
{
類的成員
}
- 類的訪問修飾符:用於設定對類的訪問限制,包括 public、internal 或者不寫,用 internal 或者不寫時代表只能在當前項目中訪問類;public 則代表可以在任何項目中訪問類。
- 修飾符:修飾符是對類本身特點的描述,包括 abstract、sealed 和 static。abstract 是抽象的意思,使用它修飾符的類不能被實例化;sealed 修飾的類是密封類,不能 被繼承;static 修飾的類是靜態類,不能被實例化。
- 類名:類名用於描述類的功能,因此在定義類名時最好是具有實際意義,這樣方便用戶理解類中描述的內容。在同一個命名空間下類名必須是唯一的。
- 類的成員:在類中能定義的元素,主要包括字段、屬性、方法。
示例練習1:聲明一個類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Student
{
/*
* 類中可以存放的成員:
* 字段:採用_camelCase命名方式
* 屬性:採用PascalCase命名方式
* 方法
*/
public string _name;//姓名
public string _gender;//性別
public int _age;//年齡
//字段和變量的區別:字段可以存放多個值,變量只能存放一個值
//聲明一個方法,用以輸出信息
//靜態方法只能調用靜態成員,非靜態方法可以調用任何成員
public void Write()
{
Console.WriteLine("我叫{0},我是{1}生,我今年{2}歲了!",_name,_gender,_age);
}
}
}
第四步,實例化對象,並調用方法:在主程序Main方法中,實例化對象,並調用我們剛纔寫的方法。實現方法:在右側解決方案資源管理器中,雙擊類名【Program.cs】,打開文件。
static void Main(string[] args)
{
//將類實例化,就是將類指定某個對象
Student zsStudent = new Student();
zsStudent._name = "張三";
zsStudent._gender = "男";
zsStudent._age = 19;
//調用非靜態方法
zsStudent.Write();
Console.ReadLine();
}
第五步,預覽效果:點擊菜單欄【啓動】,查看運行效果。
案例思考:再實例化一個對象,進行輸出。同時聲明一個變量,進行兩次賦值,然後進行輸出,觀察結果對比。
static void Main(string[] args)
{
//將類實例化,就是將類指定某個對象
Student zsStudent = new Student();
zsStudent._name = "張三";
zsStudent._gender = "男";
zsStudent._age = 19;
string mystr = "王五";//聲明一個變量,並賦值
//調用非靜態方法
zsStudent.Write();
//實例化第二個對象
Student lsStudent = new Student();
lsStudent._name = "李四";
lsStudent._gender = "女";
lsStudent._age = 18;
mystr = "趙六";//給變量mystr,重新賦值
//調用非靜態方法
lsStudent.Write();
Console.WriteLine(mystr);
Console.WriteLine(mystr);
Console.ReadLine();
}
3.2 屬性
訪問修飾符 返回值類型 方法名(參數列表)
{
方法體
}
private string _name; //定義字段
public string Name //定義屬性
{
get{return _name;}
set{_name = value;}
}
定義屬性時,我們需要首先定義一個私有字段,再定義一個公開的屬性封裝該字段,屬性中定義了 get 和 set 訪問器,通過 get 訪問器可以訪問私有字段的值,通過 set 訪問器可以設置該字段的值。 屬性按讀寫類型分爲三種:
- 讀寫屬性:get、set 訪問器都有
- 只讀屬性:只有 get 訪問器
- 只寫屬性:只有 set 訪問器
- 在 C#3.0 中,提供了新的特性:自動屬性。如 Name 屬性可以直接寫成: public string Name{get;set;} 自動屬性不需要定義私有字段(該字段由系統自動生成),簡化了代碼,用於定義沒有邏輯判斷的簡單屬性。
示例練習2:屬性的使用
第四步,聲明方法:在Clerk類中,繼續聲明一個方法,用以輸出自我介紹。
class Clerk
{
private string _name; //聲明一個私有字段_name
public string Name { get; set; } //聲明一個自動屬性
private string _gender;
public string Gender //聲明一個只讀屬性
{
get
{
_gender = "男";
return _gender;
}
}
private int _age;
public int Age //聲明一個讀寫屬性
{
get { return _age; }
set
{
if(_age<1 || _age > 100) //判斷寫入的年齡數據,是否符合邏輯
{
value = 18; //如果寫入的年齡小於1或大於100,則設置value值爲18
}
_age = value; //將value值,賦值給_age
}
}
//聲明方法,輸出職員信息
public void SayHello()
{
Console.WriteLine("我叫{0},我是{1}員工,我今年{2}歲!", Name,Gender,Age);
}
}
第五步,實例化對象,並調用方法:在主程序Main方法中,實例化對象,並調用我們剛纔寫的方法。實現方法:在右側解決方案資源管理器中,雙擊類名【Program.cs】,打開文件。
static void Main(string[] args)
{
//實例化一個對象,語法:類名 對象名 = new 類名();
Clerk zsClerk = new Clerk();
//給對象相關屬性賦值
zsClerk.Name = "張三";
//zsClerk.Gender = "女"; //Gender屬性由於是隻讀屬性,因此這裏如果給它賦值會編譯出錯
zsClerk.Age = 0;
//調用方法,語法:對象名.方法名();
zsClerk.SayHello();
Console.ReadLine();
}
第六步,預覽效果:在右側【解決方案資源管理器】中,右鍵單擊項目名稱【ConsoleApp2】——點擊【設爲啓動項目】,然後再點擊菜單欄【啓動】,查看運行效果。
- 屬性的使用:保護字段,對字段的取值與賦值進行限定。屬性往往被聲明在字段的下方,並且將字段私有化。
- get屬性訪問器用於返回屬性值,set屬性訪問器用於分配新值。
- 屬性是邏輯字段,是字段的擴展,並不佔用實際的內存;而字段佔用內存空間。
- 屬性可以被其他類訪問;而非public的字段不能被直接訪問。
- 屬性可以對接受的數據在範圍上做限定;而字段不能。
- 屬性原則上是方法,內容保存在代碼區。
3.3 封裝
- 保證了數據的安全性
- 提供了外部訪問的接口
- 類內部的修改不會影響其他類
3.4 類圖
本課總結
- .NET 是一個面向網絡、支持各種終端的開發平臺。
- .NET 框架由 CLR(公共語言運行時)和 FCL(框架類庫)組成。
- CLR 是.NET 應用程序的運行時環境,有兩個主要組件:CLS(公共語言規範)和 CTS(通用類型系統)。
- FCL 提供了大量的類庫幫助我們開發。
- 在.NET 平臺上運行的語言會首先被編譯成 MSIL(微軟中間語言)。
- 屬性是一種對字段的封裝方式,包括:讀寫屬性、只讀屬性、只寫屬性。