【C#面向對象】第一課——認識.NET框架,理解類和對象

知識點:瞭解.NET 特性、 掌握.NET 框架結構組成和原理、掌握類和對象的概念、 掌握封裝的基本概念

參考複習資料:C#編程基礎第一課:C#和.NET框架、VS軟件基本使用、編寫第一個C#程序

 

1、   .NET 平臺概述

        2000 年,微軟向全球宣佈其革命性的軟件和服務平臺,這對於消費者、企業和軟件開發商來說,預示着一個個人獲得更大的能力和充滿更多的商業機會的新時代到來。Microsoft.NET 平臺將利用互聯網爲基礎的計算和通訊的特點,通過先進的軟件技術和衆多的智能設備,提供更簡單、更個性化、更有效的互聯網服務。
 
        Microsoft.NET 不僅使計算機的功能得到大幅度的提升,讓計算機的操作變得簡單。更重要的是,用戶將完全擺脫人爲硬件束縛,可以自由衝浪於因特網中,自由訪問,自由查看,自由使用自己的數據,不束縛在 PC 的分寸空間,可以通過任何桌面系統,任何便攜式計算機,任何移動電話或者 PDA 訪問。.NET 的戰略目標是在任何時候(when),任何地方(where),任何工具(what)都能通過.NET 的服務獲得網絡上的任何信息,享受網絡帶給人們的便捷與快樂。

        .NET 框架(Framework)是.NET 平臺開發的基礎,經歷了多個版本:1.01.12.0、 3.03.54.04.5。本博文使用的是 4.5版本。
        微軟推出了非常強大的 IDE(集成開發環境)來支持.NET 平臺的軟件開發:Visual Studio。本博文使用的版本是 Visual Studio 2017 ,它支持.NET Framework4.5
 
 

1.1   .NET 平臺的魅力

.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 框架結構

接下來讓我們來了解.NET 框架的結構和工作原理。
        .NET 框架運行在操作系統上,是.NET 平臺的基礎框架。它提供了創建、部署和運行.NET 應用程序的環境,主要包括公共語言運行時(Common Language Runtime,CLR)和框架類庫(Framework Class Library,FCL,同時支持多種開發語言,如:VB.NET、 C#C++.NET 等,可以說.NET 是一種跨語言的平臺。
 
        .NET 框架的兩個主要組件是:CLR FCLCLR .NET 程序的運行環境,是框架的基礎。而 FCL 是框 架類庫的集合,使用它可以開發各種 WinformWebWebService 應用程序。
 
 

2.1   CLR

        CLR 是一個運行時環境CLR 是一個可以運行多種編程語言的運行環境。CLR 的核心功能包括:內存管理、程序集加載、安全性、異常處理和線程同步,可由面向 CLR 的所有語言使用。並保證應用和底層操作系統之間必要的分離。CLR .NET Framework 的主要執行引擎。
 
        CLR 是如何實現多語言運行的呢?我們來了解下.NET 的編譯過程,如下圖所示,不同的語言在.NET 平臺上運行,會被先編譯成微軟中間代碼(Microsoft Intermediate LanguageMSIL),然後再由即時編譯器 JIT 編譯成機器代碼由 CLR 執行。所以多語言運行的關鍵是:將語言編譯成 MSIL,目前.NET 支持的語言有:C#VB.NETC++.NET。其他語言需要需要第三方編譯器支持。
 
CLR 包括兩個組成部分:CTS(通用類型系統)和 CLS(公共語言規範) 。
 
  • CTS(Common Type System): 由於.NET 支持多種語言,每種語言的數據類型都是不一樣的,通過通用類型系統可以解決數據類型不同的問題,如 C#中的 int 類型,在 VB 中是 IntegerCTS 把它們編譯成 Int32,所有語言通用這種類型。
  • CLS(Common Language Specification): 編程語言除了數據類型外,語法也有很大區別。CLS 公共語言規範就規範了不同語言所必須遵循的最低規範,以保證語言的互操作性。如 C#命名是區分大小寫的,而 VB.NET 不區分,CLS 就規定編譯後的中間代碼命名除了大小寫還需要有別的區別。

        簡單地說,CLR是CTS的實現,也就是說,CLR是應用程序的執行引擎和功能齊全的類庫,該類庫嚴格按照CTS規範實現。作爲程序執行引擎,CLR負責安全地載入和運行用戶程序代碼,包括對不用對象的垃圾回收和安全檢查。在CLR監控之下運行的代碼,稱爲託管代碼(managed code)。

 

2.2   FCL

        .NET 中提供了豐富的框架類庫 FCL 幫助開發者進行高效開發,不同的類存放在不同的命名空間中,我們比較熟悉的有 ADO.NET 的命名空間 System.Data.SqlClient 還有 Winform 控件的命名空間System.Windows.Forms 等。FCL 是我們構建應用程序的基礎,下圖列舉了.NET 的核心類庫。
 
 

3、 類和對象

        在C#數據庫編程基礎學習的過程中,我們接觸過類和對象的概念,這裏回顧下這部分內容。
        類是概念模型,而對象是真實的實體,如:“汽車”就是概念模型——類,而“小明家的蘭博基尼跑車”則是具體的實體——對象。 類和對象之間的關係:
  • 將一組對象歸納爲類,將對象的共性抽取出來形成類的過程叫:抽象化
  • 在類的概念模型下,將狀態和行爲具體化爲實際對象的過程叫:實例化

舉例理解:類和對象的關係

        比如,我們想購買20臺電腦,在購買之前,會列出一個配置清單(CPU、內存、顯示器……),到店以後和銷售人員進行交流,確定配置清單。

  • 那麼配置清單就可以看做是一個類,對象:20臺電腦
  • 我們對類的更改,會影響到對象的更改,也就是通過類可以操作對象。比如,在配置清單(類)上,新增加一個或減少一個配件(屬性、方法),那麼會同時影響到20臺電腦(對象)。
  • 但是20臺電腦是相互獨立的,互不影響,比如說電腦可以安裝不同的操作系統,也就是對象是相互獨立的,對其中一個對象進行操作,不會影響同類下的另一個對象。

3.1  類的聲明

  • 類是一種數據結構,可以包含數據成員(常量和字段)、函數成員(方法、屬性、事件、索引器、運算符、實例構造函數、靜態構造函數和析構函數)以及嵌套類型。
  • C#中一切類型都爲類,除(引用的命名空間外)所有的語句都必須位於類(或者結構)內,不存在任何處於類(或結構)之外的語句。因此,類是C#語言的核心和基本構成模塊。比如,默認代碼中包含一個Program類。

類定義的具體語法形式如下:

類的訪問修飾符    修飾符    類名
{
    類的成員
}
  • 類的訪問修飾符:用於設定對類的訪問限制,包括 public、internal 或者不寫,用 internal 或者不寫時代表只能在當前項目中訪問類;public 則代表可以在任何項目中訪問類。
  • 修飾符:修飾符是對類本身特點的描述,包括 abstract、sealed 和 static。abstract 是抽象的意思,使用它修飾符的類不能被實例化;sealed 修飾的類是密封類,不能 被繼承;static 修飾的類是靜態類,不能被實例化。
  • 類名:類名用於描述類的功能,因此在定義類名時最好是具有實際意義,這樣方便用戶理解類中描述的內容。在同一個命名空間下類名必須是唯一的。
  • 類的成員:在類中能定義的元素,主要包括字段、屬性、方法。

 

示例練習1:聲明一個類

第一步,新建項目:在VS中新建控制檯應用(.NET Framework),這裏默認命名爲【ConsoleApp1】,單擊【確定】按鈕,自動完成創建,並打開項目。
 
 
方法一:在默認命名空間中,聲明類。(儘管可以在一個命名空間中定義多個類,但不建議使用這種方式,最好是每一個文件定義一個類,這樣方便閱讀和查找。)
 
方法二:在解決方案資源管理器中,右擊項目名稱【ConsoleApp1】,在彈出的菜單中依次選擇“添加”一“類”命令,在彈出的窗口中,設置類的名稱,這裏使用默認類名稱【Student.cs】,然後單擊【添加】,如下圖所示。
 
 
 
第二步,聲明字段:在新聲明的類Student中,聲明字段。方法:在右側解決方案資源管理器中,雙擊類名【Student.cs】,打卡文件。
 
 
第三步,聲明方法:在新聲明的類中,繼續聲明一個方法,用以輸出自我介紹。 
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();
        }

總結:變量和字段的區別:同一個字段可以存放多個值,同一個變量只能存放一個值。
 
案例思考:如果年齡是-19,也會輸出,但是不符合邏輯,如何避免出現這樣的問題?
 
 

3.2   屬性

類是由屬性和方法構成的,方法是類的行爲,C#中定義方法的語法是:
 
訪問修飾符 返回值類型 方法名(參數列表)
{
    方法體
}
屬性是類的狀態,如:名字、高度、質量等,C#中定義屬性的語法是:
private string _name;    //定義字段

public string Name      //定義屬性
{
    get{return _name;}
    set{_name = value;}
}

        定義屬性時,我們需要首先定義一個私有字段,再定義一個公開的屬性封裝該字段,屬性中定義了 get set 訪問器,通過 get 訪問器可以訪問私有字段的值,通過 set 訪問器可以設置該字段的值。 屬性按讀寫類型分爲三種:

  • 讀寫屬性:getset 訪問器都有
  • 只讀屬性:只有 get 訪問器
  • 只寫屬性:只有 set 訪問器
  • C#3.0 中,提供了新的特性:自動屬性如 Name 屬性可以直接寫成: public string Name{get;set;}   自動屬性不需要定義私有字段(該字段由系統自動生成),簡化了代碼,用於定義沒有邏輯判斷的簡單屬性。
 

示例練習2:屬性的使用

第一步,新建項目:在右側【解決方案資源管理器】中,右鍵單擊【解決方案】,一次點擊【添加】——【新建項目】,在彈出的窗口中選擇【控制檯應用(.NET Framework)】,這裏默認命名爲【ConsoleApp2】,單擊【確定】按鈕,自動完成創建,並打開項目。
 
 
 
第二步,添加類:在解決方案資源管理器中,右擊項目名稱【ConsoleApp2】,在彈出的菜單中依次選擇“添加”一“類”命令,在彈出的窗口中,設置類的名稱,這裏使用默認類名稱【Clerk.cs】,然後單擊【添加】,如下圖所示。
 
 
第三步,聲明屬性:在剛纔聲明的類中,聲明三個屬性。姓名、性別和年齡,其中性別屬性設置爲“男”,年齡屬性不能小於1或大於100。
 

第四步,聲明方法:在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   封裝

         封裝(Encapsulation)是面向對象的三大特性之一,封裝是指將現實世界中存在的某個客體的屬性與行爲綁定在一起,並放置在一個邏輯單元內。該邏輯單元負責將所描述的屬性隱藏起來,外界對客體內部屬性的所有訪問只能通過提供的用戶接口實現。這樣做既可以實現對客體屬性的保護作用,又可以提高軟件系統的可維護性。
 
封裝的特點:
  •   保證了數據的安全性
  •   提供了外部訪問的接口
  •   類內部的修改不會影響其他類
         前面將字段封裝爲屬性就是一種封裝,私有方法也是一種封裝,後期隨着對面向對象深入的學習,大家會對封裝有更深的理解。
 

 

3.4    類圖

         一般的軟件系統中都會存在大量的類,要搞清楚每個類的作用以及它們之間的聯繫,如果通過直接查看代碼的方式是非常困難的,如果使用圖形的方式就更直觀更方便,更容易被人腦接受。很多面向對象的開發工具都提供類圖來展示類的屬性和行爲,Visual Studio 中也提供類圖的功能。
 
         創建類圖的方法是:在解決方案資源管理器的,類上點擊右鍵,選擇“查看類圖”。
打開 Student 的類圖效果:
 
說明:如果發現自己的VS軟件,按照流程操作以後,沒有【查看類圖】選項,則是因爲在按照VS的時候,沒有勾選相關插件。
解決辦法:參照博文VS2017如何查看項目中的類圖?

 

 
 

本課總結

  •   .NET 是一個面向網絡、支持各種終端的開發平臺。
  •   .NET 框架由 CLR(公共語言運行時)和 FCL(框架類庫)組成。
  •   CLR .NET 應用程序的運行時環境,有兩個主要組件:CLS(公共語言規範)和 CTS(通用類型系統)。
  •   FCL 提供了大量的類庫幫助我們開發。
  •   .NET 平臺上運行的語言會首先被編譯成 MSIL(微軟中間語言)。
  •   屬性是一種對字段的封裝方式,包括:讀寫屬性、只讀屬性、只寫屬性。
 
 
 
 
 
 
 
 
===========這裏是結束分割線===========
 

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章