來講講C#中的類

来源:http://www.cnblogs.com/Helius/archive/2016/03/26/5324051.html
-Advertisement-
Play Games

1、什麼是類? 面向對象的語言,最基本的就是類。在C#中,類是這樣來定義的:類代表一組具有公共屬性和行為的對象。 舉個例子,現實生活中,人就是一個“類”,但這隻是一個統稱,指所有的人。我們要找個人一起去玩,此時就需要找到一個具體的人。比如我和小紅,我們兩個就是“人”這個類的兩個實例。 2、C#中如何 ...


1、什麼是類?

面向對象的語言,最基本的就是類。在C#中,類是這樣來定義的:類代表一組具有公共屬性和行為的對象。

舉個例子,現實生活中,人就是一個“類”,但這隻是一個統稱,指所有的人。我們要找個人一起去玩,此時就需要找到一個具體的人。比如我和小紅,我們兩個就是“人”這個類的兩個實例。

2、C#中如何定義一個類?

C#中採用關鍵詞class來定義。

class 類名{}

class前面還可以有訪問修飾符進行修飾。

訪問修飾符 說明
public 公有訪問。不受任何限制。
private 私有訪問。只限於本類成員訪問,子類,實例都不能訪問。
protected 保護訪問。只限於本類和子類訪問,實例不能訪問。
internal 內部訪問。只限於本項目內訪問,其他不能訪問。
protected internal 內部保護訪問。只限於本項目或是子類訪問,其他不能訪問

 

 

 

 

 

 

3、類的成員

類的成員包括欄位、屬性、方法和構造函數等。它們與類一樣,都有自己的訪問許可權。也可以使用static關鍵字將其聲明為類的靜態成員,註意,靜態成員屬於類級別的概念,不屬於類的實例。

3.1 欄位

欄位由三個部分組成-訪問修飾符,欄位的類型和欄位名字。

public class Person

{

  private string name;

      public int age;

  protected bool sex;

}

當然,也可以使用readonly和const來修飾,readonly不需要定義時初始化,可以在構造函數中進行初始化,而const修飾欄位也必須定義欄位的時候就完成初始化。

類可以用static進行修飾,欄位也可以使用static。當欄位使用static進行修飾的時候,只能使用 類名.欄位名進行訪問。

 

3.2 屬性

屬性是對欄位的擴展

public class Person

{

  private string name;

      public string Name

  {

    get{return name;}

    set{name=value;}

  }

}

屬性定義主要由get訪問器和set訪問器組成。前面有介紹過,屬性中get和set在IL代碼中,是被編譯成兩個方法的。用屬性來包裝欄位是因為可以更好的保護欄位,可以根據需要加入更多的邏輯控制代碼。當然,屬性也可以使用static關鍵字進行聲明,跟欄位是一樣的,屬於類級別,不能通過類的實例進行訪問,也不能在靜態屬性中使用非靜態欄位。

3.3 方法

方法=方法簽名+一系列語句的代碼

public class Person

{

  public void Print(string name)

  {

    Console.WriteLine("aaaa");

  }

}

方法也可以使用static關鍵字進行修飾,此時的靜態方法也屬於類級別的,不能用過類的實例進行訪問。

關於方法,還有一個很重要的地方,那就是方法重載,方法重載指的是在類中可以定義多個名稱相同但方法簽名不同的方法,這裡的方法簽名不同指的是方法的參數順序、參數類型和個數的不同(Warning:方法的返回值類型不屬於方法簽名的一部分)。

public class Person

{

  public void Print(string name){}

  public void Print(int age){}

}

 

3.4 構造函數

構造函數是用於創建類的實例對象的。當調用構造函數創建一個對象時,構造函數會為對象分配記憶體空間,並初始化類的成員。構造函數分為實例構造函數和靜態構造函數兩種。

(1)實例構造函數

一般在程式中,都是使用new關鍵字來創建對象的。new創建的過程,就是調用實例構造函數,來初始化類中所有的實例成員。

比如上面的Person類,雖沒有顯示寫出實例構造函數,但C#編譯器會幫我們自動生成一個函數體為空的預設午餐的實例構造函數。

構造函數有以下特點:

  • 構造函數可以進行方法重載。
  • 如果沒有為類顯示地定義一個構造函數,則C#編譯器會幫我們生成一個函數體為空的預設午餐的實例構造函數。
  • 可以對實例構造函數指定訪問級別,即可以使用public、protected和private修飾符來修飾。
  • 構造函數必須與類同名,並且不允許有返回類型。

(2)靜態構造函數

靜態構造函數用於初始化類中的靜態成員,在創建第一個實例或引用任何靜態成員之前,CLR都將自動調用靜態構造函數。

靜態構造函數有以下特點:

  • 靜態構造函數不能使用任何訪問修飾符。
  • 靜態構造函數不能帶有任何參數。
  • 靜態構造函數只會執行一次。
  • 不能直接調用靜態構造函數。
  • 在程式中,程式員無法控制靜態構造函數的時機。

3.5 析構函數

析構函數用於在類銷毀之前釋放類實例所使用的托管和非托管資源。析構函數實際上是隱式地調用了基類Object的Finalize方法。

class Person

{

  ~Person()

  {

    Console.WriteLine("析構函數被調用了");

  }

}

上面的析構函數代碼會被編譯器轉化為下麵的代碼:

protected override void Finalize()

{

  try{Console.WriteLine("析構函數被調用了");}

  finally{base.Finalize();}

}

在定義析構函數時必須要註意以下幾點:

  • 不能在結構體中定義析構函數,只能對類使用析構函數。
  • 一個類只能有一個析構函數。
  • 無法繼承或重載析構函數。
  • 無法顯示地調用析構函數,析構函數是由垃圾回收器自動調用的。
  • 析構函數既沒有修飾符也沒有參數。

 

3.6 索引器

索引器的定義類似於屬性,也具有get訪問器和set訪問器。

[修飾符] 數據類型 this[索引類型 index]

{

  get{//返回類中數組的某個元素;}

  set{//對類中數組元素賦值;}

}

this表示所操作的是對類對象的數組成員

4、類實例化

前面說過了,要得到一個類的實例對象,就必須先聲明一個該類類型的變數,然後使用new運算符後跟類的實例構造函數來完成實例化。類的實例化對象是對類的具體化。

需要註意的是:只有包含實例構造函數的類才能被實例化,而在靜態類中是不能定義實例構造函數的。

 

5、類與結構體的區別

  • 語法上的區別在於 定義類要使用關鍵字class,而結構體是使用關鍵字struct。
  • 結構體中不可對聲明欄位欄位進行初始化,但類可以。
  • 如果沒有味類顯示地定義構造函數,C#編譯器會自動生成一個無參數的實例構造函數。結構體中,無論是否顯示地定義了構造函數,隱式構造函數都是一直存在的。
  • 結構體中不能顯示地定義無參數的構造函數。
  • 在結構體的構造函數中,必須要為結構體中的所有欄位賦值。
  • 創建結構體對象可以不實用new關鍵字,但此時結構體對象中的欄位是沒有初始值的;而類必須使用new關鍵字來創建對象。
  • 結構體不能繼承結構或者類,但可以實現介面;而類可以繼承類但不能繼承結構,它也可以實現介面。
  • 類是引用類型,而結構體是值類型。
  • 結構體不能定義析構函數,而類可以有析構函數。
  • 不能用abstract和sealed關鍵字修飾結構體,而類可以。

 

感覺這篇非常非常的基礎,我也是在想到底要不要寫,後來我決定還是寫下來。萬丈高樓平地起,加上技術更新也快,但有基礎,就可以以不變應萬變了。


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

-Advertisement-
Play Games
更多相關文章
  • http://www.codeproject.com/Articles/26466/Dependency-Injection-using-Spring-NET http://stackoverflow.com/questions/29767825/spring-netnhibernate-confi ...
  • 在項目中,採用code first時建立的模型對象不能直接用於數據傳輸,需要從新根據需求建立Dto對象 為什麼需要建立Dto對象呢? 那麼在項目中需要將Model轉換成DTO,為了快速方便的轉換,可以採用Lambda Expression快速實現, 例如,建立了領域模型Book 建立DTO對象 建立 ...
  • 什麼是WCF Windows Communication Foundation(WCF)是由微軟開發的一系列支持數據通信的應用程式框架,可以翻譯為Windows 通訊開發平臺。 整合了原有的windows通訊的 .net Remoting,WebService,Socket的機制,並融合有Http和 ...
  • 01.什麼是三層架構 01.表示層(User Interface layer):負責接收用戶的輸入,將輸出呈現給用戶,以及訪問安全性驗證,並對輸入的數據的正確性,有效性及呈現樣式負責,但對輸出的數據的正確性不負責。 02.業務邏輯層(Business Logic Layer):負責系統領域業務的處理 ...
  • 一、預編譯的優點 1. 由於頁和代碼文件在第一次被請求時無需編譯,因此可以縮短對用戶的響應時間。這對於更新頻繁的大型網站尤為有用 2. 可以在用戶看到網站之前識別編譯時的 Bug 3. 可以創建站點的已編譯版本,並將該版本部署到成品伺服器,而無需使用源代碼 二、就地預編譯與針對部署的預編譯 1. 就 ...
  • 問題背景:如果使用plsql等工具可以連接Oralce說明與Oralce安裝無關。 VS連接資料庫時提示“ORA-12154: TNS: 無法解析指定的連接標識符”的解決方法 解決步驟: 1、去網上下載“instantclient-basic-win32-11.2.0.1.0.zip”,名稱為ins ...
  • 其實很早之前我就已經瞭解了在winform下實現插件編程,原理很簡單,主要實現思路就是:先定一個插件介面作為插件樣式及功能的約定,然後具體的插件就去實現這個插件介面,最後宿主(應用程式本身)就利用反射動態獲取實現了插件介面的類型作為合法的插件,從而完成動態載入及宿主與插件之間的互動。因為之前一段時間 ...
  • Windows是一個強大的操作系統,也會向開發者提供海量的系統API來幫助開發者來完成Windows系統軟體的開發工作。 整理的部分Windows API,C#可以直接調用。 1.獲取.exe應用程式的圖標 2.獲取硬碟信息 3.開機啟動程式 4.系統熱鍵操作 5.系統進程操作 6.改變視窗 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...