C# 中 static的使用

靜態(static)是C#中一個重要的關鍵字,它可以應用于類、方法、屬性和字段。

靜態類

靜態類的特點

  • 不能實例化
  • 只能包含靜態成員
  • 密封的(sealed),不能被繼承

應用場景:

  • 工具類/輔助類
  • 數學計算類:如Math類
  • 擴展方法、全局訪問等

擴展方法

擴展方法必須寫在非泛型的靜態類中
對int類型進行擴展,添加一個Divide方法,返回double類型
this 后面跟類型和參數名稱,為要進行擴展的類

   public static class ExtendMethod{public static double Divide(this int a, int b){return a*1.0 / b;}}

使用
在這里插入圖片描述

靜態類

除擴展方法外,其他類中,除非特殊需要一般不直接寫為靜態類,因為靜態類中的,方法、屬性、成員必須是靜態的。

public static class StringHelper
{    public static string Reverse(string input){char[] charArray = input.ToCharArray();Array.Reverse(charArray);return new string(charArray);}
}// 使用
var result = StringHelper.Reverse("hello");

靜態方法

  • 不依賴于實例對象
  • 單例模式的實力獲取方法
    在類中添加一個生成單例的方法,當然也運行通過new的方式創建,此時非單例
    public class Logger{private static Logger _instance;private static object _lock = new object();public static Logger GetInstance(){lock (_lock){if (_instance == null){_instance = new Logger();}return _instance;}}// 實例方法public void Log(string message){Console.WriteLine(message);}}

使用

  static void Main(string[] args){Logger logger = Logger.GetInstance();logger.Log("Test message");Console.ReadLine();}

靜態屬性

  • 共享數據,全局配置
  • 資源計數
  • 單例實例訪問
        private static object _syncObj = new object();private static KvPLC _instance = null;public static KvPLC KvInstance //單例對象{get{lock (_syncObj){if (_instance == null){_instance = new KvPLC();}}return _instance;}}

靜態字段

  • 共享數據、緩存常用數據
  • 計數器
  • 只讀常量(通常與const或readonly一起使用)
    統計User類的用戶數量
    public class User{private static int _userCount = 0;public User(){_userCount++;}public static int TotalUserCount=>_userCount;}

使用

        static void Main(string[] args){var user1 = new User();var user2 = new User();//總用戶數:2Console.WriteLine($"總用戶數:{User.TotalUserCount}");Console.ReadLine();}

優點

  • 無需實例化即可使用, 全局可訪問(需謹慎使用)

缺點

  • 可能導致代碼緊耦合,難以進行單元測試

  • 過度使用可能導致"上帝對象"問題

  • 線程安全問題(需要特別注意同步)

靜態屬性和靜態字段

訪問控制

靜態字段

  • 直接暴露數據,無訪問控制邏輯
  • 若為public,外部可直接修改值,風險較高
public static class Counter {public static int Count;  // 直接暴露
}// 外部可直接修改
Counter.Count = 100;  // 無任何驗證邏輯
  • 靜態屬性
  • 通過get/set控制訪問
  • 可添加驗證邏輯、延遲加載、線程同步等
    驗證邏輯
public static class Counter {private static int _count;public static int Count {get => _count;set {if (value >= 0)  // 添加驗證_count = value;}}
}Counter.Count = -5;  // 賦值無效,值不會被修改

延遲加載

public static class LazyData {private static Data _data;public static Data Data {get {if (_data == null) _data = LoadData();return _data;}}private static Data LoadData() { /*...*/ }
}

線程安全

public static class ThreadSafeCounter {private static int _count;private static object _lock = new();public static int Count {get { lock(_lock) return _count; }set { lock(_lock) _count = value; }}
}

初始化方式

靜態字段

  • 支持直接初始化或通過靜態構造函數
  • 可聲明為readonly(只讀)
public static class Constants {public static readonly int MaxRetries = 3;  // 運行時初始化public const string AppName = "MyApp";     // 編譯時常量
}

靜態屬性

  • 初始化需通過訪問器或靜態構造函數
  • 不可直接使用readonly,但可通過私有set實現只讀
public static class Config {public static string Environment { get; } = "Production";  // 只讀屬性public static int Timeout { get; private set; } = 30;     // 限制外部修改
}

總結

  • 簡單數據存儲 → 優先使用private static field + public static property

  • 需要控制訪問或擴展邏輯 → 必須使用靜態屬性

  • 常量數據 → 使用public const或public static readonly字段

  • 線程共享數據 → 通過屬性添加同步機制

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

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

相關文章

C++藍橋杯真題(題目+解析+流程圖)(特殊運算符+四葉玫瑰數+質因數的個數+最大的矩形紙片+數字游戲+活動人數)

C++藍橋杯真題 藍橋杯省賽C++題目分析1. 特殊運算符題目描述輸入描述輸出描述輸入輸出樣例正確代碼錯誤代碼分析流程圖2. 四葉玫瑰數題目描述輸入描述輸出描述輸入輸出樣例正確代碼錯誤代碼分析流程圖3. 質因數的個數題目描述輸入描述輸出描述輸入輸出樣例正確代碼錯誤代碼分析…

MYSQL 索引與數據結構筆記

MYSQL 索引與數據結構筆記 文章目錄 MYSQL 索引與數據結構筆記1. B-Tree 與 B Tree 基礎對比一、B 樹的優勢二、B 樹的進一步優化三、綜合對比結論 2. MySQL 為何選擇 B Tree3. 索引使用示例與性能分析3.1 整數字段索引查詢3.2 字符字段索引查詢 4. 索引失效與類型轉換陷阱5. 小…

電路中的DGND、GROUND、GROUND_REF的區別,VREF、VCC、VDD、VEE和VSS的區別?

目錄 1 DGND、GROUND、GROUND_REF的區別 1.1 DGND(Digital Ground) 1.2 GROUND(Ground) 1.3 GROUND_REF(Ground Reference) 1.4 區別 2 VREF、VCC、VDD、VEE和VSS的區別 2.1 VREF(Refere…

OpenHarmony平臺驅動開發(十),MMC

OpenHarmony平臺驅動開發(十) MMC 概述 功能簡介 MMC(MultiMedia Card)即多媒體卡,是一種用于固態非易失性存儲的小體積大容量的快閃存儲卡。 MMC后續泛指一個接口協定(一種卡式)&#xff0…

C++ 的 VS 項目中引入跨平臺包管理工具 conan

我們知道 C 不像很多其他語言有包管理工具,比如 Python 有 pip,Java 有 maven,C# 有 nuget,JS 有 npm,Go 有 go mod,Rust 有 cargo,項目中需要自己手動引入第三方庫,手動維護帶來了很…

vscode 默認環境路徑

1.下面放在項目根目錄上: .vscode/settings.json 2.settings.json內容: {"python.analysis.extraPaths": ["${workspaceFolder}"],"python.defaultInterpreterPath": "/shared_disk/users/lbg/envs/py310_see3d/b…

Android 項目中配置了多個 maven 倉庫,但依賴還是下載失敗,除了使用代理,還有其他方法嗎?

文章目錄 前言解決方案gradlemaven 倉庫 前言 我們在Android 開發的過程中,經常會遇到三方依賴下載不下來的問題。一般情況下我們會在項目的build.gradle文件中配置多個 maven 倉庫來解決。 // Top-level build file where you can add configuration options com…

uni-app 引入vconsole web端正常,安卓端報錯 Cannot read property ‘sendBeacon‘ of undefined

reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…

火山RTC 7 獲得遠端裸數據

一、獲得遠端裸數據 1、獲得h264數據 1&#xff09;、遠端編碼后視頻數據監測器 /*** locale zh* type callback* region 視頻管理* brief 遠端編碼后視頻數據監測器<br>* 注意&#xff1a;回調函數是在 SDK 內部線程&#xff08;非 UI 線程&#xff09;同步拋出來的&a…

web 自動化之 Unittest 四大組件

文章目錄 一、如何開展自動化測試1、項目需求分析&#xff0c;了解業務需求 web 功能納入自動化測試2、選擇何種方式實現自動化測試 二、Unittest 框架三、TestCase 測試用例四、TestFixture 測試夾具 執行測試用例前的前置操作及后置操作五、TestSuite 測試套件 & TestLoa…

42、在.NET 中能夠將?靜態的?法覆寫成靜態?法嗎?

在.NET中&#xff0c;不能將非靜態方法&#xff08;實例方法&#xff09;直接覆寫&#xff08;Override&#xff09;為靜態方法&#xff08;Static Method&#xff09;。以下是關鍵原因和解釋&#xff1a; 1. 方法綁定的本質區別 實例方法&#xff1a;屬于對象的實例&#xf…

8天Python從入門到精通【itheima】-1~5

目錄 1節&#xff1a; 1.Python的優勢&#xff1a; 2.Python的獨具優勢的特點&#xff1a; 2節-初識Python&#xff1a; 1.Python的起源 2.Python廣泛的適用面&#xff1a; 3節-什么是編程語言&#xff1a; 1.編程語言的作用&#xff1a; 2.編程語言的好處&#xff1a;…

3D迷宮探險:偽3D渲染與運動控制的數學重構

目錄 3D迷宮探險:偽3D渲染與運動控制的數學重構引言第一章 偽3D渲染引擎1.1 射線投射原理1.2 紋理透視校正第二章 迷宮生成算法2.1 圖論生成模型2.2 復雜度控制第三章 第一人稱控制3.1 運動微分方程3.2 鼠標視角控制第四章 碰撞檢測優化4.1 層級檢測體系4.2 滑動響應算法第五章…

mac一鍵安裝gpt-sovit教程中,homebrew卡住不動的問題

mac一鍵安裝gpt-sovit教程 僅作為安裝過程中解決homebrew卡住問題的記錄 資源地址 https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/znoph9dtetg437xb#mlAoP 下載一鍵包 下載后并解壓&#xff0c;找到install for mac.sh&#xff0c;終端執行bash空格拖拽in…

git 遠程倉庫管理詳解

Git 的遠程倉庫管理是多人協作和代碼共享的核心功能。以下是 Git 遠程倉庫管理的詳細說明&#xff0c;包括常用操作、命令和最佳實踐。 1. 什么是遠程倉庫&#xff1f; 遠程倉庫&#xff08;Remote Repository&#xff09;&#xff1a;存儲在網絡服務器上的 Git 倉庫&#xff0…

【超詳細教程】安卓模擬器如何添加本地文件?音樂/照片/視頻一鍵導入!

作為一名安卓開發者或手游愛好者&#xff0c;安卓模擬器是我們日常工作和娛樂的重要工具。但很多新手在使用過程中常常遇到一個共同問題&#xff1a;**如何將電腦本地的音樂、照片、視頻等文件導入到安卓模擬器中&#xff1f;**今天&#xff0c;我將為大家帶來一份全網最詳細的…

使用vite重構vue-cli的vue3項目

一、修改依賴 首先修改 package.json&#xff0c;修改啟動方式與相應依賴 移除vue-cli并下載vite相關依賴&#xff0c;注意一些peerDependency如fast-glob需要手動下載 # 移除 vue-cli 相關依賴 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…

uniapp|實現手機通訊錄、首字母快捷導航功能、多端兼容(H5、微信小程序、APP)

基于uniapp實現帶首字母快捷導航的通訊錄功能,通過拼音轉換庫實現漢字姓名首字母提取與分類,結合uniapp的scroll-view組件與pageScrollTo API完成滾動定位交互,并引入uni-indexed-list插件優化索引欄性能。 目錄 核心功能實現動態索引欄生成?聯系人列表渲染?滾動定位聯動性…

C#中SetProperty方法使用

SetProperty 是 MVVM&#xff08;Model-View-ViewModel&#xff09; 模式中用于實現 屬性變更通知&#xff08;INotifyPropertyChanged&#xff09; 的核心方法&#xff0c;主要用于在屬性值變化時自動更新 UI 綁定。 1. SetProperty 的基本作用 更新字段值&#xff1a;修改屬性…

MYSQL 全量,增量備份與恢復

目錄 一 數據備份的重要性 1 數據備份的重要性 2 數據庫備份類型 2.1 從物理與邏輯的角度分類 2.2. 從數據庫的備份策略角度分類從數據庫的備份策略角度,數據庫的備份可分為完全備份、差異備份和增量備份。 3 常見的備份方法 3.1 物理冷備份 物理冷備份時需要在數據庫處…