C#核心學習(六)面向對象--封裝(5)靜態成員及靜態構造函數和靜態類 以及和常量的區別

目錄

一、什么是靜態的?什么是常量?

1. ?靜態(Static)?

2. ?常量(const)?

二、類中的靜態成員有什么用?

1. ?共享數據

2. ?工具方法與全局配置

3. ?單例模式

三、靜態類和靜態成員方法的介紹

1. ?靜態類(Static Class)?

2. ?靜態構造函數(Static Constructor)?

3. ?靜態方法的限制

四、對比總結

1. ?靜態成員 vs 常量(const)?

2. ?靜態類 vs 普通類

3. ?使用場景

注意事項

前言:代碼中的“共享經濟”與“不變法則”?

????????有沒有想過,如何讓一個類的所有實例共享同一份數據?或者怎樣創建一種無需實例化就能調用的“工具包”方法?

????????在C#的世界里,?靜態成員就像魔法般的全局變量,而常量則是刻在代碼石碑上的永恒法則。它們一個靈活善變(但需謹慎),一個堅守初心(絕不妥協)。

????????本文將揭秘靜態類的“禁欲系”設計、靜態構造函數的幕后初始化大法,并帶你理清靜態成員與常量的愛恨糾葛——從此告別重復代碼,讓你的程序優雅如詩!

一、什么是靜態的?什么是常量?

1. ?靜態(Static)?

????????靜態是C#中用于描述類級別成員的關鍵字。靜態成員(如靜態字段、方法、屬性)屬于類本身而非類的實例,所有實例共享同一份靜態成員。

  • ?內存分配:靜態成員在程序啟動時分配內存,生命周期與應用程序一致。
  • ?訪問方式:直接通過類名訪問,無需實例化對象。

記住!!!
程序是不能無中生有的
我們要使用的對象 變量 函數 都是要在內存中分配空間的
之所以要實例化對象 目的就是要分配內存空間,在程序中 產生一個抽象的對象

靜態成員的特點
程序開始運行時 就會分配內存空間 所以我們可以直接使用
靜態成員和程序同生共死
只要使用了他 直到程序結束時 內存空間才會被釋放
所以每個靜態成員都有屬于自己的唯一一個小房間
這讓靜態成員便有了唯一性
在任何地方使用 都是使用小房間里面的內容 修改的也是房間里面的內容

2. ?常量(const)?

????????常量是通過const關鍵字定義的不可修改的編譯時常量

  • ?內存分配:值在編譯時確定并嵌入到IL代碼中。
  • ?不可變性:必須在聲明時賦值,且只能為基本類型(如int,?string)或null
// 靜態字段 vs 常量
public class Config {public static string Environment = "Production"; // 靜態字段(可修改)public const int MaxRetryCount = 3;               // 常量(不可修改)
}

const (常量)可以理解為特殊的靜態static
相同點:
他們都可以通過類名點出使用
不同點
1.const 必須初始化,不能修改 static 沒有這個限制
2.const 只能修飾變量,static可以修飾很多
3.const一定是寫在訪問修飾符后面的,static沒有這個要求?

二、類中的靜態成員有什么用?

1. ?共享數據

????????靜態成員用于存儲所有實例共享的數據。例如,統計類的實例總數:

public class User {public static int UserCount = 0; // 所有實例共享public User() {UserCount++;}
}Console.WriteLine(User.UserCount); // 直接通過類訪問

2. ?工具方法與全局配置

????????將無需實例化的工具方法或全局配置定義為靜態成員:

public class MathUtils {public static double PI = 3.1415926;public static int Add(int a, int b) => a + b;
}
Console.WriteLine(MathUtils.Add(2, 3)); // 直接調用靜態方法

3. ?單例模式

????????通過靜態成員實現單例(確保類只有一個實例):

public class Singleton {private static Singleton _instance;public static Singleton Instance => _instance ??= new Singleton();private Singleton() { }
}

三、靜態類和靜態成員方法的介紹

1. ?靜態類(Static Class)?

  • ?定義:用static修飾的類,不能實例化,只能包含靜態成員。
  • ?用途:封裝工具類或擴展方法容器。
public static class StringExtensions {public static string ToTitleCase(this string input) {return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input);}
}string name = "john doe";
Console.WriteLine(name.ToTitleCase()); // 輸出 "John Doe"

注意:直接類名然后點出來使用 里面的方法

2. ?靜態構造函數(Static Constructor)?

  • ?作用:初始化靜態字段或執行一次性的靜態初始化邏輯。
  • ?調用時機:在類首次被訪問(如創建實例、調用靜態方法)時自動執行。

注:這里的創造實例是指的是點出內部已經給你創造好的實例。你自己是無法new的。

????????看如下代碼:

public class Singleton {// 靜態成員管理唯一實例private static Singleton _instance;public static Singleton Instance => _instance ??= new Singleton();// 私有構造函數,禁止外部 newprivate Singleton() { } 
}// 正確!通過靜態屬性訪問唯一實例
var instance = Singleton.Instance; 

這份代碼是靜態構造函數的一個實際應用:?

????????這段代碼定義了一個?Logger?類,其核心功能是初始化日志文件的存儲目錄。通過靜態成員和靜態構造函數的設計,確保日志目錄在程序運行期間只創建一次,且無需手動初始化。

public class Logger {public static string LogDirectory;static Logger() {LogDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");Directory.CreateDirectory(LogDirectory);}
}

注意:這個主要是用來初始化,做一些配置什么的

3. ?靜態方法的限制

  • 不能訪問實例成員(非靜態字段、方法),只能訪問其他靜態成員。
  • 不能使用this關鍵字。?

四、對比總結

1. ?靜態成員 vs 常量(const)?

?特性?靜態成員?常量(const)?
內存分配運行時分配編譯時嵌入到IL代碼
可修改性可修改(除非是readonly不可修改
類型限制無限制僅支持基本類型或null
初始化時機靜態構造函數或聲明時必須在聲明時賦值

2. ?靜態類 vs 普通類

?特性?靜態類?普通類
實例化不可實例化可以實例化
成員類型僅包含靜態成員可包含靜態和實例成員
繼承不能繼承或被繼承支持繼承

3. ?使用場景

  • ?靜態成員:共享數據、工具方法、全局配置。
  • ?靜態類:工具類、擴展方法容器、單例模式。
  • ?常量:固定不變的值(如數學常數、配置標志)。

注意事項

  1. ?避免過度使用靜態成員:可能導致代碼耦合度高、難以測試。
  2. ?線程安全問題:靜態成員在多線程環境下需加鎖(如lock)。
  3. ?常量的限制:無法在運行時動態賦值(如從配置文件讀取)。
  4. ?靜態構造函數的性能:避免在靜態構造函數中執行耗時操作。

????????通過合理使用靜態成員和常量,可以顯著提升代碼的模塊化和執行效率,但需謹慎平衡其適用場景!

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

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

相關文章

FreeRTOS源碼下載分享

FreeRTOS源碼下載分享 官網下載太慢了,分享下FreeRTOSv202411 FreeRTOSv202411.00.zip 鏈接: https://pan.baidu.com/s/1P4sVS5WroYEl0WTlPD7GXg 提取碼: g6aq

2025年win10使用dockerdesktop安裝k8s

一、寫作背景 百度了一圈, 要么教程老,很多操作步驟冗余, 要么跑不通,或者提供的鏈接失效等情況。 二、看前須知 1、安裝過程使用的AI輔助, 因為參考的部分博客卡柱了。 2、如果操作過程中遇到卡頓, …

一段式端到端自動駕駛:UniAD:Planning-oriented Autonomous Driving

論文地址:https://arxiv.org/pdf/2212.10156 代碼地址:https://github.com/OpenDriveLab/UniAD 1. 摘要 現代自動駕駛系統通常由一系列按順序執行的模塊任務構成,例如感知、預測和規劃。為了完成多種任務并實現高級別的智能化,當前的方法要么為每個任務部署獨立模型,要…

【企業文化】CXO是什么?

李升偉 整理 CXO 是企業中高層管理職位的統稱,其中的 “X” 是一個變量,代表不同的職能領域。CXO 通常指企業最高管理層中的各個負責人,他們共同參與企業的戰略決策和運營管理。以下是一些常見的 CXO 職位及其職責: 1. CEO&…

python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘

python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一種字符串前綴,用于創建格式化字符串(也稱為 f-string),它是 Python 3.6 及更高版本引入的一種方便的字符串格式化方式。 基本語法和功能 當你在字符串前加上 f 前綴時,…

論文淺嘗 | Interactive-KBQA:基于大語言模型的多輪交互KBQA(ACL2024)

轉載至:何駿昊 開放知識圖譜 原文地址:論文淺嘗 | Interactive-KBQA:基于大語言模型的多輪交互KBQA(ACL2024) 筆記整理:何駿昊,東南大學碩士,研究方向為語義解析 論文鏈接&#xff…

MySQL注入中user-agent和cookie存在的注入

uagent注入 1、漏洞成因: 當Web應用程序將用戶提供的User-Agent值未經處理直接拼接到SQL查詢語句時,攻擊者可以通過構造惡意User-Agent值閉合原有SQL語句并注入任意SQL代碼。 2、以less-18為例: 相比前幾關,第18關對于uname和pa…

【算法數學篇】試除法求約數

題解:試除法求約數 題目傳送門 869. 試除法求約數 一、題目描述 給定 n 個正整數 a?,對于每個整數 a?,按照從小到大的順序輸出它的所有約數。 輸入格式: 第一行包含整數 n接下來 n 行,每行包含一個整數 a? 輸…

《UNIX網絡編程卷1:套接字聯網API》第5章 TCP客戶服務器程序示例

《UNIX網絡編程卷1:套接字聯網API》第5章 TCP客戶/服務器程序示例 5.1 本章目標與示例程序概述 本章通過一個完整的TCP回射(Echo)客戶/服務器程序,深入解析TCP套接字編程的核心流程與關鍵問題。示例程序的功能為:客戶…

封裝可拖動彈窗(vue jquery引入到html的版本)

vue cli上簡單的功能&#xff0c;在js上太難弄了&#xff0c;這個彈窗功能時常用到&#xff0c;保存起來備用吧 備注&#xff1a;deepseek這個人工智障寫一堆有問題的我&#xff0c;還老服務器繁忙 效果圖&#xff1a; html代碼&#xff1a; <div class"modal-mask&qu…

編譯器工具鏈是什么?

編譯器工具鏈&#xff08;Compiler Toolchain&#xff09; 是一組用于將源代碼轉換為可執行程序的工具和庫的集合。它涵蓋了從源代碼編寫到程序運行的整個構建過程&#xff0c;包括編譯、匯編、鏈接等多個階段。以下是關于編譯器工具鏈的詳細解釋&#xff1a; 一、編譯器工具鏈…

Spring Boot 集成Redis中 RedisTemplate 及相關操作接口對比與方法說明

RedisTemplate 及相關操作接口對比與方法說明 1. RedisTemplate 核心接口與實現類 RedisTemplate 是 Spring Data Redis 的核心模板類&#xff0c;通過 opsFor... 方法返回不同數據類型的操作接口&#xff0c;每個接口對應 Redis 的一種數據結構。以下是主要接口及其實現類&am…

linux內核漏洞檢測利用exp提權

案例一dirtycow&#xff08;CVE-2016-5159&#xff09; 有個前置知識就是 獲取liunx的內核 hostnamectl uname -a 然后這個內核漏洞進行提權的步驟也是和手工win進行提權差不多 也是需要使用輔助工具在本地進行輔助檢測 然后去nomi-sec/PoC-in-GitHub&#xff1a; &#…

重磅 | CertiK《Hack3d:2025第一季度安全報告》(附報告全文鏈接)

CertiK《Hack3d&#xff1a;2025年第一季度安全報告》現已發布&#xff0c;本次報告深入分析了2025年1至3月Web3.0領域的安全狀況。2025年第一季度共發生197起安全事件&#xff0c;總損失約為16.7億美元&#xff0c;環比激增303.4%。其中Bybit事件導致約14.5億美元的損失&#…

經典卷積神經網絡LeNet實現(pytorch版)

LeNet卷積神經網絡 一、理論部分1.1 核心理論1.2 LeNet-5 網絡結構1.3 關鍵細節1.4 后期改進1.6 意義與局限性二、代碼實現2.1 導包2.1 數據加載和處理2.3 網絡構建2.4 訓練和測試函數2.4.1 訓練函數2.4.2 測試函數2.5 訓練和保存模型2.6 模型加載和預測一、理論部分 LeNet是一…

二維碼掃不出?用QR Research工具

一.簡介 簡單來說QR Research就是用來掃二維碼的工具 當二維碼模糊不清&#xff0c;無法用普通方式掃時&#xff0c;就可以用QR Research輕松掃描。QR Research還可以分析變形/破損二維碼&#xff08;修復或提取有效部分&#xff09; 二.下載安裝 QR Research 三.例題 這…

02_使用Docker在服務器上部署Jekins實現項目的自動化部署

02_使用Docker在服務器上部署jenkins實現項目的自動化部署 一、使用docker拉取阿里云容器私有鏡像倉庫內的jenkins鏡像 登錄阿里云Docker Registry $ sudo docker login --usernamewxxxo1xxx registry.cn-shanghai.aliyuncs.com用于登錄的用戶名為阿里云賬號全名&#xff0c…

微服務組件——Eureka組件的安裝與使用指南

文章目錄 一、Eureka Server的安裝與配置1、創建Spring Boot項目2、添加依賴3、配置Eureka Server4、啟用Eureka Server5、啟動并訪問Dashboard 二、Eureka Client的配置&#xff08;服務注冊&#xff09;1、添加客戶端依賴2、配置客戶端3、啟用服務發現4、啟動服務 三、服務發…

探索Doris:日志分析的新寵,是否能取代老牌ES?

在大數據時代&#xff0c;日志存儲與分析對于企業的運營和決策起著至關重要的作用。Elasticsearch&#xff08;簡稱 ES&#xff09;作為一款廣泛應用的開源分布式搜索和分析引擎&#xff0c;長期以來在日志管理領域占據著舉足輕重的地位。然而&#xff0c;隨著技術的不斷發展&a…

學習threejs,使用Texture紋理貼圖,測試repeat重復紋理貼圖

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??Texture 紋理貼圖1.1.1 ??…