【C#】構造函數實用場景總結

文章目錄

  • 前言
  • 一、構造函數是什么?
  • 二、構造函數的用法
    • 1.初始化對象,避免無效狀態
    • 2 初始化靜態成員
    • 3 構造函數重載
    • 4.構造函數鏈
    • 5. 單例模式,多次實例化保持一個對象
    • 6. 依賴注入
    • 7. 初始化只讀對象


前言

構造函數是我們平常編程里經常能碰到的老伙計了,構造函數本質上是類中一種特殊的成員方法,用于在實例化對象的時候,對該類中的一些狀態進行初始化。本篇文章總結下工作中經常能碰到的使用構成函數的場景,希望能幫助到大家。

一、構造函數是什么?

構造函數可以理解成一個特殊的方法,當一個類被實例化時,這個構造函數會被自動調用,用作初始化這個對象。但是,構造函數的功能根據應用場景,可以擴展為不同的用法。

二、構造函數的用法

1.初始化對象,避免無效狀態

很多時候初始化對象,需要給對象設定一種狀態,我哪一種業務邏輯舉例。賣出去的商品價格不能為負數,庫存數量也不能小于零。

這里構造函數最的作用是保證商品對象在創建時就處于有效狀態,避免因價格設置錯誤,庫存數量設置錯誤導致后續邏輯出錯,作為一個業務邏輯的檢驗之用。

internal class Product
{public string productId { get; }/// <summary>/// 價格 > 0/// </summary>public double price { get;  }/// <summary>/// 庫存 > 0/// </summary>public int stock { get; }// 構造函數:初始化+參數校驗public Product(String productId, double price, int stock){this.productId = productId;// 校驗價格合法性,非法則拋出異常,阻止對象創建if (price < 0){throw new ArgumentOutOfRangeException("商品價格不能為負數:" + price);}this.price = price;// 校驗庫存合法性if (stock < 0){throw new ArgumentOutOfRangeException("商品庫存不能為負數:" + stock);}this.stock = stock;}
}

2 初始化靜態成員

靜態變量,靜態屬性這類成員屬于類本身,而非類的實例。它的初始化方式就是通過構造函數初始化的。確保了靜態成員在類的整個生命周期中保持一致的初始狀態,適合存儲全局共享的數據。

比方說一個日志類需要一個屬性存放文件目錄,用靜態屬性的方式就很合適,使用構造函數初始化靜態成員。

internal class log
{public static string PhyPath { get; private set; }static log(){PhyPath = AppDomain.CurrentDomain.BaseDirectory;}
}

3 構造函數重載

構造函數重載允許一個類定義多個構造函數,這些構造函數具有相同的名稱但參數不同,包括不限于參數個數,參數類型,參數順序。這是一種靈活的初始化方式,從而應對實例化的時候的各種場景。

這里提供兩種構造函數,一個參數是包含電影名稱和描述信息,另一個構造函數只包含電影名稱,這樣實例化Movie類的時候,就能通過兩種方式實例化Movie。為對象提供多種初始化方式,滿足不同場景的需求

internal class Movie
{public int Id { get; set; }public string MovieName { get; set; }public string Desc { get; set; }public Movie(string MovieName){this.MovieName = MovieName;this.Desc = "";}public Movie(string MovieName,string Desc){this.MovieName = MovieName;this.Desc = Desc;}}

4.構造函數鏈

子類繼承父類的時候,子類可以通過base關鍵字調用父類的構造函數,實現子類向父類傳遞參數的情況,也能避免重復代碼。

比方說我有一個父類,提供一個構造函數,子類可以通過調用父類的構造函數實現狀態的配置化。

/// 父類
public BaseClass(String HttpMethod)
{if (HttpMethod.ToUpper() == "GET"){_httpRequest = HttpContext.Current.Request.QueryString;}if (HttpMethod.ToUpper() == "POST"){_httpRequest = HttpContext.Current.Request.Form;}
}/// 子類
public ChiledClass() : base(HttpContext.Current.Request.HttpMethod)
{
}

5. 單例模式,多次實例化保持一個對象

在數據操作這類服務,經常是能碰到使用單例模式的場景。多次實例化一個數據服務對象,返回的任然是同一個實例,禁止外部直接創建對象。這樣既能保證資源利用的最大化,并且類能自主控制創建規則,保證代碼安全性。

比方說初始化一個RedisServer服務,其構造函數是私有的,無法直接通過初始化的時候執行這個構造函數。通過Lazy這延遲初始化工具,確保RedisServer實例在首次被使用時通過調用內部私有的構造函數創建,實現 “懶加載”。最后通過一個靜態實例返回lazy.Value 實現單例模式

/// <summary>
/// Redis單例服務
/// </summary>
public sealed class RedisServer
{//私有靜態字段,存儲唯一實例private static readonly Lazy<RedisServer> lazy = new Lazy<RedisServer>(() => new RedisServer());/// <summary>/// 靜態實例/// </summary>public static RedisServer Instance { get { return lazy.Value; } }/// <summary>/// Redis連接對象/// </summary>private readonly ConnectionMultiplexer _redis;/// <summary>/// Redis數據庫對象/// </summary>private readonly IDatabase _db;/// <summary>/// Redis單例服務/// </summary>private RedisServer(){/// 邏輯:/// 1. 創建Redis連接對象/// 2. 創建Redis數據庫對象}/// <summary>/// 獲取Redis數據庫對象/// </summary>public IDatabase GetDatabase(){return _db;}
}

6. 依賴注入

依賴注入中,也可以是通過構造函數來實現接收依賴項的。另外就是這里通過構造函數初始化只讀屬性,這樣可以創建不可變對象,實現線程安全。

[Route("api/[controller]/[action]")]
[ApiController]
public class AuthController : ControllerBase
{private readonly ILogger<AuthController> _logger;private readonly IJWTService _jwtService;public AuthController(ILogger<AuthController> logger = null, IJWTService jwtService = null){_logger = logger;_jwtService = jwtService;}[HttpGet]public ActionResult<string> test(){return "test";}[HttpPost]public ActionResult<string> Login([FromBody]LoginUser loginUser) { var token =  _jwtService.GenerateToken(new CurrentUser() { UserId = loginUser.UserId,Name = "張三",Age = 18,NickName = "張三", RoleList = new List<string>() { "admin" } });return token;} 
}

7. 初始化只讀對象

只能在構造函數中初始化readonly字段,創建不可變對象,實現線程安全。

代碼如上。

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

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

相關文章

LLM預訓練架構全解析:從零構建一個語言世界的“操作系統”

導讀&#xff1a;作為開發者&#xff0c;我們每天都在import或#include各種庫&#xff0c;我們信任這些由無數代碼構成的底層依賴。那么&#xff0c;當我們調用一個LLM時&#xff0c;它所依賴的那個更底層的、無形的**“語言操作系統”**&#xff0c;又是如何被“編譯”出來的&…

Linux服務測試題(DNS,NFS,DHCP,HTTP)

一&#xff0c;實驗拓撲&#xff1a;二&#xff0c;需求APPSRV&#xff1a;主機名&#xff1a;appsrv.example.comip地址&#xff1a;192.168.100.10網關&#xff1a;192.168.100.254網卡為NAT模式STORAGESRV&#xff1a;主機名&#xff1a;storagesrv.example.comip地址&#…

DevOps 簡介及就業前景

DevOps 簡介及就業前景 目錄 DevOps簡介核心概念重難點解析具體場景使用就業前景學習路徑最佳實踐 DevOps簡介 什么是DevOps DevOps是Development&#xff08;開發&#xff09;和Operations&#xff08;運維&#xff09;的組合詞&#xff0c;是一種軟件開發和IT運維的文化…

《CF1120D Power Tree》

題目描述 給定一棵有 n 個頂點的有根樹&#xff0c;樹的根為頂點 1。每個頂點都有一個非負的價格。樹的葉子是指度為 1 且不是根的頂點。 Arkady 和 Vasily 在樹上玩一個奇怪的游戲。游戲分為三個階段。第一階段&#xff0c;Arkady 購買樹上的一些非空頂點集合。第二階段&…

CPTS-Agile (Werkzeug / Flask Debug)

枚舉 nmap -sC -sV -T4 -Pn -n -p- 10.10.11.203進行常規的網頁枚舉和測試發現報錯信息&#xff0c;‘Werkzeug / Flask Debug’ 測試Export導出功能發現存在路徑遍歷查看這篇文章 https://book.hacktricks.wiki/zh/network-services-pentesting/pentesting-web/werkzeug.html#…

【網絡運維】Shell 腳本編程:while 循環與 until 循環

Shell 腳本編程&#xff1a;while 循環與 until 循環 循環結構簡介 循環語句是 Shell 腳本中用于重復執行一條或一組指令的重要工具&#xff0c;直到滿足特定條件時停止執行。Shell 腳本中常見的循環語句包括 while、until、for 和 select。本文將重點介紹 while 和 until 兩種…

LLM 中評價指標與訓練概要介紹

在【LLM】LLM 中增量解碼與模型推理解讀一文中對 LLM 常見名詞進行了介紹&#xff0c;本文會對 LLM 中評價指標與訓練概要進行介紹&#xff0c;本文并未介紹訓練實操細節&#xff0c;未來有機會再了解&#xff5e; 一、LLM 如何停止輸出 在看 LLM 評價指標前&#xff0c;先看…

Java 20 新特性及具體應用

目錄 1. 模式匹配 for switch&#xff08;預覽特性&#xff09; 2. 記錄模式&#xff08;預覽特性&#xff09; 3. 外部函數與內存 API&#xff08;預覽特性&#xff09; 4. 矢量 API&#xff08;孵化器特性&#xff09; 5. 作用域值&#xff08;預覽特性&#xff09; 6. …

【STM32】CubeMX(十一):FreeRTOS任務掛起與解掛

這篇文章是 STM32 HAL FreeRTOS 下的任務掛起與恢復機制&#xff0c; 結合 CubeMX 圖示與代碼&#xff0c;構建了一個 FreeRTOS 控制示例。 本篇目標&#xff1a;創建兩個任務&#xff1a; 一個控制藍燈閃爍&#xff08;myTask01&#xff09; 另一個監控按鍵&#xff08;Start…

圖片預加載:提升Web性能的關鍵

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

大模型壓縮三劍客:量化、剪枝與知識蒸餾全解析

在人工智能飛速發展的今天&#xff0c;大語言模型&#xff08;LLM&#xff09;如通義千問、GPT 等已成為推動智能應用的核心引擎。然而&#xff0c;這些模型動輒數十億甚至上千億參數&#xff0c;帶來了高昂的計算成本和部署門檻。如何在不顯著犧牲性能的前提下&#xff0c;讓大…

Seaborn數據可視化實戰:Seaborn基礎圖表繪制入門

基礎圖表繪制&#xff1a;Seaborn入門教程 學習目標 通過本課程的學習&#xff0c;你將掌握如何使用Seaborn庫繪制基礎圖表&#xff0c;包括條形圖、折線圖和散點圖。你將了解Seaborn的基本函數和參數設置&#xff0c;以及如何通過調整這些參數來優化圖表的視覺效果。 相關知識…

阿里開源通義萬相Wan2.2:視頻生成技術的革命性突破

在人工智能視頻生成領域,阿里云通義實驗室于2025年7月重磅開源了新一代視頻生成大模型 Wan2.2,其核心亮點包括人體動作生成的極致精度、電影級美學表達以及高效的資源利用效率,標志著視頻生成技術邁入了一個全新的階段。 一、核心功能:三大模型,覆蓋全場景視頻生成 Wan2.…

說說你對Integer緩存的理解?

大家好&#xff0c;我是鋒哥。今天分享關于【說說你對Integer緩存的理解?】面試題。希望對大家有幫助&#xff1b; 說說你對Integer緩存的理解? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; Integer 緩存是 Java 中一個優化機制&#xff0c;它主要通過緩存一部…

高速CANFD收發器ASM1042在割草機器人輪轂電機通信系統中的適配性研究

摘要割草機器人輪轂電機的通信系統對其實現自主控制和高效作業至關重要。本文旨在研究國科安芯推出的高速CANFD收發器芯片ASM1042是否能夠滿足割草機器人輪轂電機通信系統的復雜需求。通過詳細分析輪轂電機通信系統的性能要求&#xff0c;以及ASM1042的電氣、功能和環境特性&am…

MTK Linux DRM分析(十二)- KMS Panel框架層(drm_panel.c、drm_mipi_dbi.c、drm_mipi_dsi.c)

一、簡介 三個代碼文件(drm_mipi_dbi.c、drm_panel.c、drm_mipi_dsi.c)的分析。這些文件都是Linux內核DRM(Direct Rendering Manager)子系統的組成部分,主要用于支持顯示面板,特別是通過MIPI(Mobile Industry Processor Interface)接口的顯示設備。它們提供了顯示驅動…

合合信息acge模型獲C-MTEB第一,文本向量化迎來新突破

前言&#xff1a; 在當今時代&#xff0c;大型語言模型以其驚人的發展速度和廣泛的應用前景&#xff0c;正成為全球科技界的矚目焦點。這些模型的強大能力&#xff0c;源自于背后默默支撐它們的Embedding技術——一種將語言轉化為機器可理解的數值向量的關鍵技術。隨著大型語言…

26.內置構造函數

2.內置構造函數2.1Object2.2Array2.3String2.4number

tauri配置允許執行eval腳本,在打包cocos游戲web/phone移動端的時候一定要配置

解決辦法&#xff1a;在tauriconfig中配置"csp": "default-src self asset: unsafe-inline customprotocol://* http://localhost:* ws:localhost:* unsafe-eval ipc: http://ipc.localhost; script-src unsafe-eval self https://www.googletagmanager.com uns…

K 均值聚類算法學習總結

一、聚類算法基礎認知 核心概念&#xff1a;聚類屬于無監督學習&#xff0c;核心是把 “相似的樣本” 自動分到同一組&#xff08;簇&#xff09;&#xff0c;不需要預先標注的標簽。主要挑戰是怎么定義 “相似性”、評估聚類效果以及確定最好的聚類數量。 距離度量&#xff1a…