c#面向對象程序設計

一、面向對象與面向過程的核心區別(概念鋪墊)

代碼背景

開篇對比了兩種編程范式:

  • 面向過程(PP):按步驟分解問題(如 “輸入長→輸入寬→計算面積”);

  • 面向對象(OOP):將問題抽象為 “對象”,通過對象的屬性和行為解決問題(如 “矩形對象” 有長、寬屬性和計算面積的方法)。

補充知識點
  • 編程范式:是解決問題的 “方法論”,OOP 更適合復雜系統(可維護性、復用性強),PP 適合簡單流程(如腳本工具)。

  • 對象的核心特征狀態(屬性)行為(方法) 的封裝。例如 “人” 的屬性是姓名、年齡,行為是吃飯、睡覺。

二、類與對象的基礎定義(Rectangle 類示例)

代碼解析
class Rectangle ?// 類定義
{public int Length; ?// 屬性(字段)public int Width; ? public int Area() ?// 方法{return Length * Width;}
}
?
// 實例化對象并使用
Rectangle rectangle = new Rectangle(); ?
rectangle.Length = 5; ?
rectangle.Width = 3; ?
Console.WriteLine(rectangle.Area()); ?// 輸出15
補充知識點
  • 類的本質:“模板” 或 “藍圖”,定義對象的 “能有什么”(屬性)和 “能做什么”(方法)。

  • 對象的實例化new 類名() 是創建對象的語法,本質是在內存中分配空間,初始化屬性。

  • 成員訪問:通過 對象.成員 訪問屬性或調用方法,體現對象的 “自主性”。

三、類的創建與結構(People 類示例)

代碼解析
class People ?// 類定義(默認internal修飾符)
{string name; ?// 私有字段(默認private)int age; ? ? ?void eat() ? ?// 私有方法{Console.WriteLine("吃飯");}
}
補充知識點
  • 類的結構三要素:

    • 字段(成員變量):存儲對象的狀態(如nameage);

    • 方法:定義對象的行為(如eat());

    • 訪問修飾符:控制成員的可訪問范圍(核心是封裝)。

  • 訪問修飾符作用:

    • public:任何地方可訪問(如對外暴露的接口);

    • private:僅類內部可訪問(如內部計算的臨時變量);

    • internal:僅當前項目可訪問(如項目內共享的工具類)。

訪問修飾符 / 范圍當前類父類實例對象引用當前項目的項目子類引用當前項目實例對象同一程序集的非子類不同程序集的子類不同程序集的非子類
public
private×××××××
internal××
protected××××
protected internal××
private protected××√ (僅同一程序集)××× (不同程序集)×

四、對象的實例化與成員訪問(People 對象示例)

代碼解析
// 實例化對象
People p1 = new People(); ?
p1.name = "吳亦凡"; ?// 訪問公共字段(需先將name改為public)
?
// 對象初始化器(語法糖)
People p2 = new People() { name = "羅志祥" }; ?
?
// 調用方法
p1.eat(); ?
People.sleep(); ?// 調用靜態方法
補充知識點
  • 對象初始化器new 類名() { 成員 = 值 } 簡化對象屬性賦值,本質是先調用構造函數,再賦值。

  • 靜態成員訪問:靜態方法 / 屬性屬于類本身(如People.sleep()),無需實例化對象,通過類名.成員訪問;非靜態成員屬于對象(如p1.eat()),必須通過實例訪問。

五、屬性與字段的封裝(Student、Dog 類示例)

代碼解析
class Student
{private char _sex; ?// 私有字段(內部存儲)public char Sex ? ? // 公共屬性(外部訪問接口){get { return _sex; } ?// 獲取值set ? ? ? ? ? ? ? ? ? // 設置值(帶驗證){if (value == '男' || value == '女')_sex = value;elsethrow new Exception("性別必須是男或女");}}
}
補充知識點
  • 封裝的核心體現:用私有字段存儲數據,通過公共屬性控制訪問,避免外部直接修改導致數據混亂(如年齡不能為負、性別只能是男女)。

  • 屬性的訪問器:

    • get:返回字段值(可添加邏輯,如計算后返回);

    • set:接收外部傳入的value(需與屬性類型一致),可添加驗證邏輯。

  • 字段與屬性的本質區別:

    • 字段是 “容器”(直接存數據);

    • 屬性是 “接口”(不存數據,通過get/set操作字段,實現數據保護)。

六、構造函數與對象初始化(People 類構造函數示例)

代碼解析
class People
{public string Name { get; set; }public int Age { get; set; }
?// 無參構造函數public People(){Console.WriteLine("無參構造執行");}
?// 有參構造函數(重載)public People(string name, int age){Name = name;Age = age;}
}
補充知識點
  • 構造函數作用:對象實例化時自動執行,用于初始化對象(如設置默認值、驗證參數)。

  • 構造函數重載:同一類中多個構造函數,參數列表不同(體現多態),滿足不同初始化需求(如無參構造用默認值,有參構造自定義值)。

  • 默認構造函數:若未手動定義構造函數,編譯器自動生成無參構造;若定義了有參構造,默認無參構造會被覆蓋,需手動添加。

七、析構函數與垃圾回收(People 析構函數示例)

代碼解析
class People
{~People() ?// 析構函數{Console.WriteLine("析構函數執行");}
}
?
// 觸發垃圾回收
People p1 = new People(); ?
p1 = null; ?// 解除引用
GC.Collect(); ?// 強制回收
補充知識點
  • 析構函數作用:對象被垃圾回收(GC)時自動執行,用于釋放非托管資源(如文件句柄、數據庫連接)。

  • GC 機制:C# 自動管理內存,當對象無引用時,GC 會在合適時機回收內存,析構函數執行時機不可控,因此優先使用IDisposable接口手動釋放資源。

八、靜態成員與實例成員(People 靜態成員示例)

代碼解析
class People
{public string Name1 { get; set; } ?// 實例屬性public static string Name2 { get; set; } ?// 靜態屬性
?public void Test1() ?// 實例方法{Console.WriteLine(Name1); ?// 可訪問實例和靜態成員Console.WriteLine(Name2);}
?public static void Test2() ?// 靜態方法{// Console.WriteLine(Name1);  錯誤:靜態方法不能訪問實例成員Console.WriteLine(Name2); ?// 只能訪問靜態成員}
}
補充知識點
  • 靜態成員特性:

    • 屬于類,所有對象共享一份(如計數器、工具方法);

    • 生命周期與程序一致(程序啟動時加載,結束時釋放);

    • 靜態方法中無this指針(因不依賴對象)。

  • 應用場景:工具類(如Math)、全局配置(如AppConfig)、單例模式等。

九、常量與只讀成員(Test 類示例)

代碼解析
class Test
{public const int c = 2; ?// 常量(編譯期確定)public readonly int a = 1; ?// 只讀字段(運行期確定)
?public Test(){a = 10; ?// 只讀字段可在構造函數中賦值}
?private string _d = "1";public string D { get => _d; } ?// 只讀屬性(無set)
}
補充知識點
  • const 與 readonly 區別:

    • const:編譯時確定值,必須聲明時賦值,可用于字段 / 局部變量;

    • readonly:運行時確定值,可在聲明或構造函數中賦值,僅用于字段。

  • 只讀屬性:僅保留get訪問器(如D),確保屬性只能被讀取,無法外部修改,增強封裝。

十、繼承與派生(People→Student→SamllStudent 示例)

代碼解析
// 基類
class People
{public string Name { get; set; }public void Eat() { Console.WriteLine("吃飯"); }
}// 派生類
class Student : People  // 繼承語法:派生類:基類
{public string StudentId { get; set; }  // 新增屬性public void Study() { Console.WriteLine("學習"); }
}// 繼承鏈:SamllStudent → Student → People → object
class SamllStudent : Student { }
補充知識點
  • 繼承核心作用:代碼復用(子類繼承父類所有成員,除構造函數、析構函數)。

  • C# 繼承特性:

    • 單繼承:一個類只能直接繼承一個基類(避免菱形繼承問題);

    • 傳遞性:SamllStudent間接繼承People的成員;

    • 向上轉型:People p = new Student()(子類對象可賦值給父類變量,體現多態)。

十一、作業:Aircraft 類的完整封裝(綜合應用)

代碼核心模塊解析
public class Aircraft
{// 1. 私有字段(內部存儲)private string _brand;private int _loadCapacity;  // 最大裝載人數private string _aircraftType;  // 飛機類型private int _currentLoad;  // 當前裝載人數// 2. 公共屬性(外部訪問接口,帶驗證)public int LoadCapacity{get => _loadCapacity;set{if (value < 0) throw new ArgumentException("最大裝載人數不能為負");_loadCapacity = value;CalculateAircraftType();  // 自動計算類型GenerateCurrentLoad();    // 生成當前人數}}public string AircraftType => _aircraftType;  // 只讀屬性// 3. 構造函數(初始化)public Aircraft(string brand, int loadCapacity){_brand = brand;LoadCapacity = loadCapacity;  // 觸發類型計算}// 4. 私有方法(內部邏輯)private void CalculateAircraftType(){_aircraftType = _loadCapacity > 400 ? "大型" : (_loadCapacity > 200 ? "中型" : "小型");}private void GenerateCurrentLoad(){_currentLoad = new Random().Next(1, _loadCapacity + 1);  // 隨機生成}// 5. 公共方法(對外行為)public void TakeOff(){Console.WriteLine($"{_brand}起飛,當前裝載{_currentLoad}人");}
}
知識點綜合應用
  • 封裝:通過LoadCapacity屬性的set訪問器驗證輸入合法性,確保_loadCapacity不為負。

  • 自動邏輯:設置LoadCapacity時自動觸發CalculateAircraftType(根據人數分類型)和GenerateCurrentLoad(隨機生成當前人數),體現對象的 “自主性”。

  • 只讀屬性AircraftType僅暴露get,確保類型由內部邏輯計算,外部無法修改。

  • 構造函數:通過有參構造函數初始化核心屬性,簡化對象創建流程。

總結

面向對象編程的核心是 “抽象” 與 “封裝”:通過類抽象事物的共性,通過對象實例化具體事物,通過訪問修飾符、屬性、方法控制數據和行為的訪問,最終實現高內聚、低耦合的代碼設計。Aircraft 類綜合應用了字段、屬性、構造函數、方法等要素,是面向對象思想的典型實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90409.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kylin V10 4070安裝nvidia驅動+CUDA+docker安裝

目錄 1.系統版本信息 2.安裝nvidia驅動 3.CUDA安裝 4.docker離線安裝 1.系統版本信息 查看一下系統版本&#xff0c;命令為&#xff1a; cat /etc/kylin-release2.安裝nvidia驅動 編輯/usr/lib/modprobe.d/dist-blacklist.conf文件 blacklist nvidiafb加#號注釋掉 添加…

首家!數巔AskBI通過中國信通院數據分析智能體專項測試

近日&#xff0c;在中國信息通信研究院組織的數據分析智能體&#xff08;Data Agent&#xff09;專項測試中&#xff0c;數巔生成式分析智能體AskBI順利完成專項測試的全部內容。《數據智能體技術要求》標準及測試簡介中國信通院云計算與大數據研究所依托中國通信標準化協會大數…

一些Avalonia與WPF內容的對應關系和不同用法

UIElement、FrameworkElement和ControlWPFAvaloniaUIElementControlFrameworkElementControlControlTemplatedControl在 WPF 中&#xff0c;通過繼承 Control 類來創建新的模板控件&#xff0c;而在 Avalonia 中&#xff0c;從 TemplatedControl 繼承。在 WPF 中&#xff0c;通…

【REACT18.x】CRA+TS+ANTD5.X封裝自定義的hooks復用業務功能

模擬react中的hooks方法&#xff0c;實現自定義的hooks來封裝我們需要重復使用的組件&#xff0c;來優化代碼。這種hooks也是利用了react的原生hooks來實現我們需要的特定業務&#xff0c;可以返回任何我們需要的值&#xff0c;也可以不返回值&#xff0c;作為一個副作用方法使…

Vue CSR 到 Nuxt 3 SSR 遷移:技術實現與問題解決實錄

1. 遷移動機與技術選型1.1 CSR 架構的局限性 基于 Vue 3 和 Vite 構建的客戶端渲染 (CSR) 單頁應用 (SPA) 提供了良好的開發體驗和用戶交互流暢性。但是其核心局限在于&#xff1a;搜索引擎優化 (SEO)&#xff1a;初始 HTML 響應僅包含一個根 div 元素&#xff0c;實際內容由 J…

FastGPT + Kymo:解鎖企業專屬知識庫與智能體開發新體驗

在信息爆炸的時代&#xff0c;企業如何讓知識“活起來”&#xff1f;傳統文檔庫和搜索框早已無法滿足需求。FastGPT——基于RAG技術的開源知識庫系統&#xff0c;正重新定義企業級知識管理&#xff01; 一、FastGPT是什么&#xff1f; FastGPT是企業構建專屬知識庫的智能核心…

人形機器人_雙足行走動力學:Maxwell模型及在擬合肌腱特性中的應用

一、Maxwell模型及其在擬合肌腱特性中的應用Maxwell模型是經典的粘彈性力學模型之一&#xff0c;由彈簧&#xff08;彈性元件&#xff09;和阻尼器&#xff08;粘性元件&#xff09;串聯組成。其在生物力學領域的應用主要聚焦于材料的動態響應&#xff08;如應力松弛和蠕變&…

「iOS」——KVC

源碼學習iOS底層學習&#xff1a;KVC 底層原理一、核心 API 與功能特性**常用方法**KVC 設值 底層原理KVC 取值 底層原理自定義KVC設值取值**特性&#xff1a;無隱私訪問****原理**四、多元應用場景1. **動態數據處理**&#xff08;1&#xff09;字典轉模型&#xff08;2&#…

【Lucene】leafreadercontext邏輯段與segment物理磁盤段的關系

在 Lucene 中&#xff0c;“葉子段”&#xff08;LeafReaderContext&#xff09;和 “segment”&#xff08;物理段&#xff09;在 Lucene 語境下&#xff0c;LeafReaderContext ≈ segment 的運行時只讀視圖。概念 所在層次 含義 是否一一對應 segment 物理存儲層 Lucene 索引…

Python進階第三方庫之Matplotlib

應用Matplotlib的基本功能實現圖形顯示 應用Matplotlib實現多圖顯示 應用Matplotlib實現不同畫圖種類 1、什么是Matplotlib是專門用于開發2D圖表(包括3D圖表) 以漸進、交互式方式實現數據可視化 2、為什么要學習Matplotlib可視化是在整個數據挖掘的關鍵輔助工具&#xff0c;可以…

【深度解析】從AWS re_Invent 2025看云原生技術發展趨勢

2025 年 6 月 28 日 在科技浪潮持續翻涌的當下&#xff0c;云原生技術已然成為推動企業數字化轉型與創新發展的關鍵力量。而 AWS re:Invent 作為云計算領域一年一度的盛會&#xff0c;向來是展示前沿技術、洞察行業趨勢的重要舞臺。在今年的 AWS re:Invent 2025 大會上&#xf…

高亮標題里的某個關鍵字正則表達式

使用v-html渲染&#xff0c;寫一個高亮方法<span class"title-name" v-html"highlightKeywords(name, keywords)"></span>這里傳入的name帶了文件拓展名&#xff0c;所以先把名稱從文件名里提取出來// 高亮標題顏色highlightKeywords(name, ke…

視頻編解碼中colorspace,color_range,color_trc,color_primaries,是做什么用的,是誰來指定的

在視頻編解碼中&#xff0c;colorspace&#xff08;色彩空間&#xff09;、color_range&#xff08;色域范圍&#xff09;、color_trc&#xff08;傳輸特性&#xff09;、color_primaries&#xff08;原色&#xff09;是一組色彩相關元數據&#xff0c;它們共同決定了視頻的顏色…

【QT】 Qt背景介紹與概述

文章目錄&#x1f4dd;Qt背景介紹&#x1f320; 什么是Qt&#x1f309;Qt的發展史&#x1f320; Qt?持的平臺&#x1f309; Qt版本&#x1f309; Qt的優點&#x1f309; Qt的應?場景&#x1f320; Qt的成功案例&#x1f320; Qt的發展前景及就業分析&#x1f6a9;總結&#x…

如何將擁有的域名自定義鏈接到我的世界服務器(Minecraft服務器)

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

2025暑期—07深度學習應用-總結

人有自動選取卷積核的能力&#xff0c;傳統的圖像處理不能自動選取卷積核非線性作用函數&#xff0c;Sigmoid由于梯度消失使用Relu。卷積神經網絡的卷積核是未知的&#xff0c;自適應的。其中的權重是不斷變化的&#xff0c;就是卷積核是不斷變化的。卷積模糊了&#xff0c;池化…

數據結構-4(常用排序算法、二分查找)

一、思維導圖二、冒泡排序def bubble_sort(ls):"""用i循環,逐步比較相鄰元素,直到循環結束,停止交換&#xff0c;就像一個個氣泡從下往上冒泡,每一次的循環結果都是最大的元素到了后面已排序序列的列首。"""j 0 # 用于確定循環次數,同時用于下…

策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的組合使用

using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp9 {internal class Program{static async Task Main(string[] args){Console.WriteLine("Hello, World!");// 創建并配置依賴注入容器var _serviceProvider new ServiceCollection().AddScoped…

es0102---語法格式、數據類型、整合springboot、創建庫、創建映射、新增數據、自定義查詢

ES 一、創建映射字段的語法格式 需要先構建索引庫&#xff0c;在構建索引庫中的映射關系 PUT /索引庫名/_mapping {"properties": {"字段名": {"type": "類型","index": true&#xff0c;"store": false&#…

spring boot h2數據庫無法鏈接問題

spring boot h2數據庫無法鏈接問題datasource:# 數據庫連接地址&#xff1a;H2在2.x后&#xff0c;不再支持創建數據庫&#xff0c;需要手工創建&#xff0c;如&#xff1a;touch test.mv.db&#xff0c;# 否則會報“Database file not found”錯誤url: jdbc:h2:file:~/testdri…