.NET Core CSharp初級篇 1-3面向對象

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/07/18/11208495.html
-Advertisement-
Play Games

.NET Core CSharp 初級篇 1 3 本節內容為面向對象初級教程 類 簡介 面向對象是整個C 中最核心最有特色的一個模塊了,它很好的詮釋了程式與現實世界的聯繫。 面向對象的三大特征:繼承、多態、封裝;繼承的含義可以理解為集合中的包含關係,例如人類屬於動物類的一個分支,這就是一種繼承。多態 ...


.NET Core CSharp初級篇 1-3

本節內容為面向對象初級教程

簡介

面向對象是整個C#中最核心最有特色的一個模塊了,它很好的詮釋了程式與現實世界的聯繫。

面向對象的三大特征:繼承、多態、封裝;繼承的含義可以理解為集合中的包含關係,例如人類屬於動物類的一個分支,這就是一種繼承。多態的理解就可以是人的呼吸用肺,鯉魚使用鰓,這就是一種同種操作對應不同的實現。封裝可以理解為一堆零件可以組成一個手機,這個過程就叫做封裝。而將電腦顯卡等拆下來組裝成另一臺電腦,則屬於類的拆箱裝箱。

封裝一個類的好處在哪裡呢?我舉一個例子:
首先,我們考察一個常見的生活實例來進行說明,例如每當發工資的日子小王都來到 ATM 機
前,用工資卡取走一筆錢為女朋友買禮物,從這個很帥的動作,可以得出以下的結論:

  • 小王和 ATM 機之間,以銀行卡進行交互。要取錢,請交卡。
  • 小王並不知道 ATM 機將錢放在什麼地方,取款機如何計算錢款,又如何通過銀行卡返回小王
    所要數目的錢。對小王來說,ATM 就是一個黑匣子,只能等著取錢;而對銀行來說,ATM 機就
    像銀行自己的一份子,是安全、可靠、健壯的員工。
  • 小王要想取到自己的錢,必須遵守 ATM 機的對外約定。他的任何違反約定的行為都被視為不
    軌,例如欲以磚頭砸開取錢,用公交卡冒名取錢,盜卡取錢都將面臨法律風險,所以小王只能
    安分守己地過著月光族的日子。
    那麼小王和 ATM 機的故事,能給我們什麼樣的啟示?對應上面的 3 條結論,我們的分析如下:
  • 小王以工資卡和 ATM 機交互信息,ATM 機的入卡口就是 ATM 機提供的對外介面,磚頭是塞不
    進去的,公交卡放進去也沒有用。
  • ATM 機在內部完成身份驗證、餘額查詢、計算取款等各項服務,具體的操作對用戶小王是不
    可見的,對銀行來說這種封閉的操作帶來了安全性和可靠性保障。
  • 小王和 ATM 機之間遵守了銀行規定、國家法律這樣的協約。這些協約和法律,就掛在 ATM 機旁邊的牆上。

具體來說,封裝隱藏了類內部的具體實現細節,對外則
提供統一訪問介面,來操作內部數據成員。這樣實現的好處是實現了 UI 分離,程式員不需要知道
類內部的具體實現,只需按照介面協議進行控制即可。同時對類內部來說,封裝保證了類內部成
員的安全性和可靠性。在上例中,ATM 機可以看做封裝了各種取款操作的類,取款、驗證的操作
對類 ATM 來說,都在內部完成。而 ATM 類還提供了與小王交互的統一介面,並以文檔形式——
法律法規,規定了介面的規範與協定來保證服務的正常運行
類屬於在堆分佈的變數,意味著它的大小是不固定的。可以動態的進行調節。

創建與實例化類

類的創建非常的簡單,實例化也非常的簡單,創建類就是把一個具體的事物抽象化,實例化就是將抽象化的類給轉換成具象化的對象。例如我們定義一個People類,內含若幹個變數;

//定義類使用class關鍵字
class People
{
    public string Name;
    public int Age;
}
//實例化類
People p = new People();

或許你還看不太懂這些,別急,請繼續往下看。

修飾符

訪問控制修飾符

  • public:對訪問沒有任何限制,屬於最高級別的訪問許可權
  • private:私有許可權,最低級別的訪問,只能在聲明的代碼段(類)中使用。
  • protected:保護許可權,只有繼承了該類才可以使用。
  • internal:僅包含當前程式集使用
  • protect internal:同一個程式集的類和其派生的類可以使用

這樣說或許過於抽象,我們這樣來解釋吧,一個程式就類似一個公司,public就好比是董事長、CEO一類的許可權,擁有著最高級別的訪問;protected你可以理解為部門經理,它的下屬就是繼承該部門,下屬可以訪問父類(部門)的資源,但不可以訪問其他部門的protected資源,體現為一種縱向的許可權控制。Internal類似與考勤部門,無論該部門是否屬於考勤部門領導,考勤部門都可以管轄其他部門,體現為一種橫向的許可權控制。Protected internal則是具有兩種屬性。

可選修飾符

  • static(可用於類內成員):靜態的,表示只被創建一次,屬於所有對象公用的變數
  • sealed:密封類,禁止類被繼承
  • abstract:抽象類,要求類被繼承,並且不能實例化
  • virtual(不能用於類):表示可以被重寫
  • readonly(用於欄位):表示該欄位只讀
  • const(用於欄位):表示常量
  • extern(用於函數):表示該函數由外部實現
  • async(用於函數):表示該函數為非同步函數

函數

函數也被稱為方法,是包含一系列語句的代碼塊。封裝了類的行為,提供了類的對外表現。用於將封裝的內部細節以公有方法提供對外介面,從而實現與外部的交互與響應。例如,從上面屬性的分析我們可知,實際上對屬
性的讀寫就是通過方法來實現的。因此,對外交互的方法,通常實現為 public。程式通過調用該方法並指定任何所需的方法參數使語句得以執行。 在 C# 中,每個執行的指令均在方法的上下文中執行。

函數的構成由訪問控制關鍵字+修飾符+返回值+函數名稱+函數參數+函數體,如果一個類內函數或者其他成員使用了static關鍵字,則可以不實例化類對其進行調用,因為使用了static標明的成員,屬於全體該類對象共有。例如下麵這個例子:

class Man
{
    static void GettingOld()
    {
        //life - 1s
    }
    public void Eat()
    {
    }
}
//靜態方法可以直接調用
Man.GettingOld();
Man man = new Man();
man.Eat();

函數的使用如下,其中x,y稱為形參,x1,y1稱為實參,通常對形參的操作並不會影響到實參

public static int Add(int x,int y)
{
    x++;y++;
    return x+y;
}
int x1 =5;
int y1 =6;
Add(x1,y1);
//帶有預設參數
public static int Add(int x,int y=4)
{
}
//不定參數
public void Add(params object[] a)
{
}

當然不是所有的方法都被實現為 public,否則類內部的實現豈不是全部暴露在外。必須對對外
的行為與內部操作行為加以區分。因此,通常將在內部的操作全部以 private 方式來實現,而將需要與外部交互的方法實現為 public,這樣既保證了對內部數據的隱藏與保護,又實現了類的對外交互。例如在 ATM 類中,對錢的計算、用戶驗證這些方法涉及銀行的關鍵數據與安全數據的保護問題,必須以 private 方法來實現,以隱藏對用戶不透明的操作,而只提供返回錢款這一 public 方法介面即可。在封裝原則中,有效地保護內部數據和有效地暴露外部行為一樣關鍵。

函數的重載與重寫

重載函數表示使用同一個函數名,通過參數的不同,從而實現使用同一個名稱可以選擇調用多種函數。例如實現兩個數字的相加,傳入的有可能是整型參數也有可能是浮點型參數,因此,我們選擇使用重載函數去實現。以下是一個重載的例子;

public static int Add(int x,int y)
{
    return x+y;
}
public static double Add(double x,double y)
{
    return x+y;
}
Add(1,2);//調用第一個Add
Add(1.1,2.2);//調用第二個函數

通過調用函數時傳入的參數不同,就可以很簡單的用不同方法實現。

函數重寫則多出現在面向對象的多態性中,這裡我不會很詳細的講解,在後面會有一個詳細的講解。重寫就可以理解為,人呼吸用肺,大部分魚類呼吸用鰓,呼吸這個函數就是在兩個類中被重寫過(即實現方法在不同的類中)。具體的實現我會在後一步進行講解

需要註意的是,重載需要在參數上有本質的區別,例如個數、類型不同,重寫則需要方法可以被重寫,使用override關鍵字表明重寫的函數

類中重要的兩個函數

構造函數:構造函數是一種特殊的函數,它的簽名和類名一致,並且沒有返回值。它可以接受任意個參數。當類被實例化的時候,對應的構造函數會被調用。可以說,對象是通過調用類的構造函數進行創建。如果不指定構造函數,C#會自動調用預設的無參構造函數。如果重載了構造函數,並且傳入了指定參數,則會調用對應的構造函數。

析構函數:類似與構造函數,但是調用是在GC(垃圾回收器)回收類對象的時候自動調用,通常無需去重寫。例如:

class A
{
       //預設無參構造函數
       public A()
       {
       }
       public A(int a)
       {
       } 
       // 析構函數
       ~A()
       {
       }
}
A a = new A(1);//調用第二個構造函數

欄位和屬性

(此處補充IL代碼)

欄位:類中具體實現存儲數據的變數,你可以理解為各個零件。通常而言,欄位不會對外進行開發訪問許可權。例如:幼兒園讀書的小朋友類,裡面有一個Age(年齡)欄位。假設一個人實例化,我們給年齡賦值上1000。這符合常理嗎?顯然是不符合的。那麼我們就要使用屬性進行控制輸入的變數。

屬性:屬性不存儲數據,通常定義為 public,表示類的對外成員。屬性具有可讀、可寫屬性,通過 get 和 set 訪問器來實現其讀寫控制。但是如果你使用預設的屬性實現方法,例如public string a {get;set;},C#會自動的為你隱式生成一個私有的欄位a。屬性本質上是作為外部訪問欄位的一個媒介、橋梁,也稱之為介面。通常來說,我們會將欄位定義為私有的,將屬性定義為公有的,通過屬性去返回和設置其中的值。在這裡,我們涉及到了兩個從未見過的關鍵字——get,set。

get訪問器:get訪問器本質上是一個返回值為屬性類型的函數,你可以使用dnSpy進行反編譯查看。你一般需要在get中返回你需要訪問的變數。

set訪問器:使用value關鍵字接受外界傳來的參數並且賦值給你的欄位,本質上也只是一個函數,當你對屬性賦值的時候,就會調用他的set控制塊內的代碼

class A
{
    private int a;
    public int A 
    {
        get{return a;}
        set
        {
            if(value>5)
            {
                a=value;
            }
        }
    }
    //自動生成一個b欄位
    public int B{get;set;}
}

練習題

  • 請試著創建一個圓類(Circular),要求封裝圓周率和半徑(或直徑),並且定義一個含有一個參數的構造函數,傳入的是半徑(直徑)。並寫入計算周長和麵積的函數。

  • 定義一個用戶類,要求用戶名和密碼不可以被訪問,只允許設置,並且密碼小於6位需要輸出相應提示並且不進行賦值要求重新賦值。

前往Github獲取更多本節資料(PPT,實例代碼)
如果我的教程幫到了您,希望您動動小手,在GitHub給我一個star

Github

BiliBili主頁

WarrenRyan's Blog

博客園

Reference

《你必須知到的.NET》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#是跟著楊老師的教程走的,在這裡感謝一下老師的無私奉獻,他的cnblog地址:>cgzl,他的B站地址:>solenovex。 進入正題: Delegate表示委托,委托是一種數據結構,它引用靜態方法或引用類實例及該類的實例方法。(引用官方文檔的英文原話) Represents a delegat ...
  • UEditor 的核心特點就是:產自大廠、開源免費、功能全面(相當全)、體驗較為切合國人習慣。只需要修改相應的後端代碼,即可把 UEditor/UMeditor 中的圖片上傳到諸如又拍雲 USS 或阿裡雲 OSS 等雲存儲伺服器上,既安全又經濟。 ...
  • 在我們做工業軟體中,經常會遇到要實時監控某一點,在這個點變化時去做一些事情 放入程式里呢,就是要實時監控某一屬性的值,當值發生變化時觸發事件,其核心就是藉助屬性的Set方法,來判斷當前set的值是否與原來的值相等,如果相等直接賦值不予理會,如果不相等,說明值變了,根據自己調用的方法,聲明委托,事件, ...
  • GDB資料庫SQL操作平臺 開發本軟體的初衷:由於計算資料庫要素層屬性的時候,涉及到要計算多個欄位,或者要根據代碼計算名稱,得一個一個的篩選並計算,過程比較繁瑣,於是就想能不能通過像處理SQLServer數據一樣的,通過寫SQL語句來執行,在此覺得很有必要,於是就開發了本軟體,通過SQL語句(可以通 ...
  • 首先要引用這個服務,http://www.webxml.com.cn/Webservices/WeatherWebService.asmx 添加服務和引用 >轉到 >高級 >添加WEB應用 >添加引用 到此OK。 1個text,1個button,2個lable private void btn_se ...
  • 嘗試了一天,嘗試了各種方法,一下方法最直接方便. ...
  • Swagger實例分享(VS+WebApi+Swashbuckle) Swagger可以很方便的為發佈的WebApi自動生成優雅的文檔,不需額外自己編寫,只需為項目配置好,是一個很好用的工具,做一個簡單的Demo和大家分享一下~ 1、使用HuGet導入Swashbuckle包 2、修改Swagger ...
  • .NET Core CSharp 初級篇 1 2 本節內容迴圈與判斷 迴圈 迴圈是一個在任何語言都是極為重要的語法,它可以用於很多東西,例如迭代數組等等。在C 中,語法層面的迴圈有: for , foreach , while , do goto 五種。迴圈你可以理解為當某條件滿足時,重覆的執行一段 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...