C#核心(24)結構體和類的區別,抽象類和接口的區別(面試常問)

前言

隨著上一節我們對StringBulider的講解落下帷幕,c#核心的知識點我們也即將告一段落,我們講完了面向對象要用的三大特性(封裝,繼承,多態)和七大原則。期中自然也不乏一些小的散的碎的的知識點。

今天我們要講的也正如標題所說,是面試里經常用來開門拷打你的問題

所以我們今天主要講結論(為了幫助你更好的背誦來對付面試),至于為什么,或者說你想探究他的深層原理,那博主可能就愛能莫助了,我們今天在這里都只會進行很簡單的探討(因為博主水平還沒那么厲害,足夠厲害了再發一篇講的更細的),大家主要記住結論。

自然,你想自己根據先前學的知識自己梳理一下也是可以的。

在這節,我們也會簡單探討一下使用的場景和情況,供大家參考。

結構體和類的區別

區別概述

  1. 結構體和類最大的區別在存儲空間上,結構體是類型,類是引用類型。
  2. 這意味著,結構體的存儲空間在棧上,類的存儲空間在堆上
  3. 結構體有封裝,但是無繼承和多態,也就是說不能使用protected
  4. 結構體的賦值不能為空,類可以。

細節區別

  • 結構體成員變量申明指定初始值?

  • 結構體不能申明無參構造函數,析構函數

  • 需要你進一步專研

結構體的特別之處

結構體可以繼承接口,因為接口是行為的抽象,接口是一種只包含方法、屬性、事件和索引器的抽象類型,定義了對象應有的行為。它們不依賴于特定的實現,因此結構體和類都可以實現相同的接口。

如何選擇

  1. 用繼承多態的場景選類
  2. 數據結合為對象優先結構體(類也可以,但是不建議)
  3. 值和引用類型的考慮

抽象類和接口的區別

相同點

  1. 都可以被繼承

  2. 都不能直接實例化

  3. 都可以包含方法的申明?

  4. 子類必須實現沒有實現的方法

  5. 滿足里氏替換原則

區別

  1. 抽象類中可以有構造函數 ,接口不行

  2. 抽象類是單一繼承,但是接口可以繼承多個

  3. 抽象類中可以有成員變量

  4. 抽象類中也可以申明方法

  5. 抽象類中有訪問修飾符

選擇?

區別對象和行為的差距,然后在抽象類和接口中進行選擇。這兩個都是為了規范出現的東西,母的是幫助我們更好規范我們的編程行為。

總結

在本節中,我們深入探討了 C# 中結構體和類以及抽象類和接口的相關知識,為應對面試提供關鍵結論。主要學習了以下要點:

  1. 結構體和類的區別
    • 核心差異:結構體為值類型,存儲于棧上;類是引用類型,存儲在堆上。結構體僅有封裝,無繼承與多態,不能用 protected;類具備封裝、繼承和多態。結構體賦值不可為空,類則可以。
    • 細節特性:結構體成員變量聲明不能指定初始值,且無法聲明無參構造函數和析構函數。不過,結構體能夠繼承接口,因其抽象行為不依賴特定實現,與類一樣可實現相同接口。
    • 應用場景:涉及繼承多態時優先選類;將數據組合為對象,結構體是較好選擇(類雖也能實現,但不推薦)。
  2. 抽象類和接口的區別
    • 共同特性:二者均可被繼承,不能直接實例化,可包含方法聲明,子類必須實現未實現的方法,均遵循里氏替換原則。
    • 不同之處:抽象類有構造函數,接口沒有;抽象類是單一繼承,接口可多重繼承;抽象類可擁有成員變量、聲明方法并設置訪問修飾符。
    • 選用準則:依據對象與行為的差異,在抽象類和接口間抉擇,它們的存在旨在規范編程行為。

請期待我的下一篇博客!

期待您的關注與支持,感謝您對于佑夢游戲開發的關注!

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

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

相關文章

HTMLCSS實現異環網站,期末web作業

本網站是我在學習前端時敲得,僅供學習使用。 這段代碼是一個完整的 HTML 網頁項目,包含 HTML、CSS 和 JavaScript 部分,用于構建一個名為 “異環” 的網頁。網頁具備頭部導航欄、主體視頻展示、圖片交互元素、音樂播放控制、視頻彈窗播放以及…

Oracle表的別名不能用as,列的別名可以用as

在 Oracle 數據庫中,?表的別名?和?列的別名?在使用 AS 關鍵字時確實有不同規則,以下是詳細說明: 1. 表的別名(Table Alias)? ?不支持 AS 關鍵字?,直接跟在表名后即可。?語法示例?: S…

【SAP ME 44】在 HANA DB中報廢SFC時的SHOP_ORDER表記錄鎖定

癥狀 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 報廢期間持有鎖,當同時調用數量較大時,可能會導致 HANA 數據庫出現大量鎖積壓。這有時會導致因等待 HANA 數據庫釋放“選擇更新”鎖而導致報廢 SFC 花費數分鐘。 HANA 數據庫日志中的示例: # begin PreparedStatement_ex…

Vscode開發Vue項目NodeJs啟動報錯處理

文章目錄 背景一、npm啟動報錯報錯信息定位原因處理方案第一步、下載安裝高版本 二、node 無法識別報錯信息處理方案定位原因第一步、檢測環境變量第二步、重新開啟界面 背景 使用Vscode開發Vue項目,使用到NodeJs,記錄出現的問題及處理方案,…

破局遺留系統!AI自動化重構:從靜態方法到Spring Bean注入實戰

在當今快速發展的軟件行業中,許多企業都面臨著 Java 遺留系統的維護和升級難題。這些老舊系統往往采用了大量靜態方法,隨著業務的不斷發展,其局限性日益凸顯。而飛算 JavaAI 作為一款強大的 AI 工具,為 Java 遺留系統的重構提供了全新的解決方案,能夠實現從靜態方法到 Spring B…

2025媽媽杯數學建模C題完整分析論文(共36頁)(含模型建立、可運行代碼、數據)

2025 年第十五屆 MathorCup 數學建模C題完整分析論文 目錄 摘 要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1思路分析 4.1.2問題1模型建立 4.1.3問題1代碼(僅供參考) 4.1.4問題1求解結果(僅…

【Python爬蟲詳解】第一篇:Python爬蟲入門指南

什么是網絡爬蟲? 網絡爬蟲(Web Crawler)是一種自動獲取網頁內容的程序。它可以訪問網站,抓取頁面內容,并從中提取有價值的數據。在信息爆炸的時代,爬蟲技術可以幫助我們高效地收集、整理和分析互聯網上的海…

【JavaWeb后端開發02】SpringBootWeb + Https協議

課程內容: SpringBootWeb 入門 Http協議 SpringBootWeb案例 分層解耦 文章目錄 1. SpringBootWeb入門1.1 概述1.2 入門程序1.2.1 需求1.2.2 開發步驟1.2.3 常見問題 1.3 入門解析 2. HTTP協議2.1 HTTP概述2.1.1 介紹2.1.2 特點 2.2 HTTP請求協議2.2.1 介紹2.2.2…

MATLAB 控制系統設計與仿真 - 37

范數魯棒控制器的設計 魯棒控制器的設計 根據雙端子狀態方程對象模型結構,控制器設計的目標是找到一個控制器K(s),它能保證閉環系統的范數限制在一個給定的小整數下,即 這時控制器的狀態方程為: 其中X與Y分別為下面兩個代數Riccati方程的解…

依賴沖突,缺失插件導致無法啟動項目 強制安裝命令(npm install --legacy-peer-deps)

小白終成大白 文章目錄 小白終成大白前言總結 前言 運維工程師說搞一個自動化打包流程 在服務器裝了hbuilder 找前端來啟動項目 我沒啟動起來 … 啟動報錯 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…

數據戰略新范式:從中臺沉淀到服務覺醒,SQL2API 如何重塑數據價值鏈條?

一、數據中臺退燒:從 “戰略神話” 到 “現實拷問” 曾幾何時,數據中臺被視為企業數字化轉型的 “萬能解藥”,承載著統一數據資產、打破業務壁壘的厚望。然而,大量實踐暴露出其固有缺陷:某零售企業投入 500 萬元建設中…

警惕阿里云中的yum update操作不當導致:/sbin/init被清空導致Linux無法正常啟動

由于使用阿里云進行部署測試,因而會對yum update進行操作,這兩天更新了systemd-239-82.0.3.4.al8.2.x86_64,但存在報錯,然后進行yum history undo和清空yum cache,但出現操作Linux命令行無效。具體來說,幾個…

論文閱讀:2023 ICLR Safe RLHF: Safe Reinforcement Learning from Human Feedback

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback 安全 RLHF:通過人類反饋進行安全強化學習 https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe…

android rom打包解包工具,Android ROM定制:boot.img、recovery解包打包

安卓boot.img和recovery.img解析與修改指南 安卓映像文件結構解析 大家都知道安卓的核心更換是在boot.img里面,那么如何在Windows下解開它呢?這里介紹一個實用的方法。 首先需要獲取bootimg.exe工具,這個工具最初是為華為設備開發的&#…

cdp-(Chrome DevTools Protocol) browserscan檢測原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打開devtools后訪問網址,檢測結果網頁顯示紅色Robot,標簽插入位置,確定斷點位置可以hook該方法,也可以使用插件等方式找到這個位置,本篇不討論. Robot標簽是通過insertBefore插入的. 再往上追棧可以發現一個32長度數組,里面…

PostgreSQL 通過 copy 命令導入幾何數據 及 通過 CopyManager.copyIn() 導入幾何數據

COPY命令介紹 copy是postgresql提供的一個專門用于快速導入導出數據的命令,通常用于從文件(TXT、CSV等)或標準輸入輸出中讀取或寫入數據。適合批量導入導出數據,速度快。 默認情況下,如果在處理過程中遇到錯誤,COPY將失敗。 COPY只能用于表,不能用于視圖!!! COPY…

常用的幾種 Vue 父子組件傳值方式

1. 父組件向子組件傳值(props) 父組件代碼:Parent.vue <template><div><h2>父組件</h2><Child :parent-msg="parentMsg" /></div> </template><script> import Child from ./Child.vue;export default {componen…

【1】云原生,kubernetes 與 Docker 的關系

Kubernetes&#xff1f;K8s&#xff1f; Kubernetes經常被寫作K8s。其中的數字8替代了K和s中的8個字母——這一點倒是方便了發推&#xff0c;也方便了像我這樣懶惰的人。 什么是云原生&#xff1f; 云原生&#xff1a; 它是一種構建和運行應用程序的方法&#xff0c;它包含&am…

Eureka搭建

1.注冊中心server端 1.1.引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</…

2025年最新版動漫短劇系統開發小程序app教程,源碼部署上線

以下是動漫短劇系統開發上線的詳細教程&#xff0c;包含從0到1的全流程&#xff1a; 一、需求分析&#xff08;關鍵&#xff1a;明確核心功能&#xff09; 核心功能清單&#xff1a; 用戶端&#xff1a;短視頻瀏覽、彈幕評論、收藏/點贊、創作者關注、付費訂閱。創作者端&am…