【原理】C#構造函數可以標記為Static嗎

【從UnityURP開始探索游戲渲染】專欄-直達

  • 實例構造函數(Instance Constructor)不能標記為static
  • 但C#提供了一種特殊的? 靜態構造函數(Static Constructor)專門用于初始化靜態成員。
  • 下面依次介紹他們:

1. ?實例構造函數(不能標記為static)?

  • 用于初始化?實例成員?。
  • 每次創建類的新實例時調用。
  • ?不允許?使用static關鍵字修飾。
csharp
public class MyClass {
// 實例構造函數(正確)public MyClass() {
// 初始化實例成員}
//  ? 錯誤:實例構造函數不能標記為static// public static MyClass() { ... }
}

2. ?靜態構造函數(隱式static)?

  • 用于初始化?靜態成員?。
  • 在整個程序生命周期內?最多自動調用一次?(在類首次被使用時觸發)。
  • 必須滿足以下語法:
    • 使用static關鍵字。
    • ?不能有訪問修飾符?(如publicprivate),默認為private
    • ?不能有參數?。
    • 類中最多只能有一個靜態構造函數。
csharp
public class MyClass {static MyClass() {
// 初始化靜態成員}
}

關鍵總結

特性實例構造函數靜態構造函數
?關鍵字?static(不能標記為static必須使用static
?調用時機?每次創建實例時調用類首次使用時自動調用(僅一次)
?參數?可以有參數?不能有參數?
?訪問修飾符?支持(如publicprivate?不允許?(默認為private
?用途?初始化實例成員初始化靜態成員

何時使用靜態構造函數?

當類中的靜態成員(如靜態字段)需要復雜的初始化邏輯(例如讀取配置文件或構建靜態數據結構)時使用:

csharp
public class Logger {public static string LogPath { get; }static Logger() {LogPath = LoadLogPathFromConfig();// 復雜初始化}private static string LoadLogPathFromConfig() { ... }
}

錯誤示例

csharp
public class MyClass {
//  ? 編譯錯誤:實例構造函數不能是靜態的public static MyClass() { ... }//  ? 編譯錯誤:靜態構造函數不能有訪問修飾符public static MyClass() { ... }//  ? 編譯錯誤:靜態構造函數不能有參數static MyClass(string param) { ... }
}

?結論?:

普通構造函數(實例構造函數)?不能?標記為static,但C#提供了專門的?靜態構造函數語法?(使用static關鍵字且無訪問修飾符/參數)來初始化靜態成員。兩者設計目的和調用機制完全不同。

使用示例

  • 基礎使用場景(初始化靜態成員)靜態構造函數常用于初始化類的靜態字段,例如統計類實例數量:
csharp 
public class Logger
{public static int InstanceCount;public static string LogDirectory;static Logger(){InstanceCount = 0;LogDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"AppLogs");Directory.CreateDirectory(LogDirectory);}
}
  • 當首次訪問Logger類時,會自動創建日志目錄并初始化計數器。

  • 配置加載示例適合加載只需執行一次的配置文件:

csharp
public class AppConfig
{public static readonly Dictionary<string, string> Settings;static AppConfig(){Settings = new Dictionary<string, string>();var config = ConfigurationManager.AppSettings;foreach (var key in config.AllKeys){Settings.Add(key, config[key]);}}
}
  • 該構造函數在程序首次使用配置時自動加載。

  • 復雜初始化場景處理相互依賴的靜態字段初始化:

csharp
public class A
{public static int X = B.Y + 1;static A() { }
}public class B
{public static int Y = A.X + 1;static B() { }
}
  • 運行時能正確處理這種交叉引用關系。

關鍵特性說明:

  • 每個類只能有一個靜態構造函數
  • 不能包含訪問修飾符或參數
  • 在以下情況自動調用:創建第一個實例前訪問任何靜態成員前
  • 執行時機由CLR控制,不可顯式調用

特殊注意事項:

  • 當同時存在靜態構造函數和靜態字段初始化時,字段初始化器會先執行。例如:
csharp
public class Test
{public static Test t = new Test();static Test() => Console.WriteLine("靜態構造");public Test() => Console.WriteLine("實例構造");
}
// 輸出順序:實例構造 -> 靜態構造

典型應用場景:

  • 初始化靜態字典/集合
  • 注冊事件處理器
  • 加載本地化資源
  • 建立數據庫連接池

注意

  • 靜態構造函數中應避免拋出異常,否則會導致TypeInitializationException

【從UnityURP開始探索游戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)

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

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

相關文章

數據結構--樹(3)

數據結構基礎&#xff08;13&#xff09; 文章目錄數據結構基礎&#xff08;13&#xff09;--樹樹的存儲結構樹的存儲方式1&#xff1a;雙親表示法&#xff08;順序存儲&#xff09;樹的存儲方式2&#xff1a;孩子表示法樹的存儲方式3&#xff1a;孩子兄弟表示法樹轉二叉樹森林…

sys.stdin讀取鍵盤輸入【持續更新~】

背景sys.stdin主要用來讀取鍵盤的一行或者多行輸入&#xff0c;讀取后表達形式為字符串。下文主要探討sys.stdin.readline()的使用&#xff0c;sys.stdin.read()參考&#xff1a;sys.stdin.readline()是逐行讀取&#xff0c;通常會配合.strip()清除首尾的換行符/空格sys.stdin.…

近閾值技術引領者:STM32U3系列的能效與安全革新

引言 當電池供電設備已深度融入生活的每一個角落&#xff0c;功耗控制與續航能力儼然成為制約技術演進的核心瓶頸。在此背景下&#xff0c;超低功耗新系列STM32U3憑借前沿的近閾值設計理念&#xff0c;為受功耗瓶頸限制的設備提供了突破性解決方案&#xff0c;也為能耗管理開啟…

Vue3 中的 provide 和 inject 詳解:實現跨組件通信

一、provide 和 inject 概述在 Vue3 中&#xff0c;provide 和 inject 是一對用于實現跨層級組件通信的 API&#xff0c;它們解決了 props 需要逐層傳遞的繁瑣問題。1.1 基本概念provide (提供)&#xff1a;在祖先組件中提供數據inject (注入)&#xff1a;在任意后代組件中注入…

Kafka 零拷貝(Zero-Copy)技術詳解

文章目錄1. 什么是零拷貝2. Kafka 如何實現零拷貝2.1 sendfile 系統調用2.2 mmap 內存映射3. 傳統拷貝 vs 零拷貝3.1 傳統文件傳輸流程3.2 零拷貝文件傳輸流程4. Kafka 零拷貝的具體實現4.1 消息消費時的零拷貝4.2 日志段文件的零拷貝5. 零拷貝帶來的性能優勢6. 零拷貝的適用場…

Vue 中 v-for 的使用及 Vue2 與 Vue3 的區別

v-for 基本用法v-for 是 Vue 中用于循環渲染列表的指令&#xff0c;基本語法如下&#xff1a;運行<!-- Vue2 和 Vue3 通用基本語法 --> <div v-for"(item, index) in items" :key"item.id">{{ index }} - {{ item.name }} </div>Vue2 和…

本地搭建dify+deepseek智能體

今天開始搭建智能體&#xff0c;學習一下&#xff0c;也是公司轉型所需。(Windows下的docker安裝給我差點干破防了&#xff0c;安裝了一周docker才成功。我真就要放棄的時候&#xff0c;又意外成功了/(ㄒoㄒ)/~~)0、準備階段 配置Windows10的基本配置。 按下鍵盤Windows鍵&…

網絡常識-SSE對比Websocket

SSE&#xff08;Server-Sent Events&#xff09;和Websocket都是用于實現服務器與客戶端實時通信的技術&#xff0c;但它們的設計理念、通信模式和適用場景有顯著區別。以下從核心差異和適用場景兩方面具體說明&#xff1a; 一、核心區別維度SSE&#xff08;Server-Sent Events…

lamp架構部署wordpress

CentOS 7主機&#xff1a;lamp.example.comIP&#xff1a;192.168.100.101、關閉防火墻與selinux# 關閉防火墻systemctl stop firewalldsystemctl disable firewalld# 關閉selinuxvim /etc/selinux/config # 或vim /etc/sysconfig/selinuxSELINUXdisabled:wq# 重啟reboot 2、開…

DC6v-36V轉3.2V1A恒流驅動芯片WT7017

DC6v-36V轉3.2V1A恒流驅動芯片WT7017WT7017是一款于連續工作模式下的降壓LED恒流轉換器&#xff0c;可驅動單只或多只LED,內置高精度電流檢測器&#xff0c;能通過外置電阻設定輸出電流,開關式1A恒流芯片。軟啟動、高達1MHZ開關頻率,開路保護,輸入范圍在6V-40VDC內都能穩定可靠…

js如何循環HTMLCollection

場景 當使用document.getElementsByClassName方法獲取一個包含DOM節點的集合arr時&#xff0c;正常的forEach和map操作都會報一個arr.map is not a function的錯誤因為這里的arr并不是標準的 數組 (Array)&#xff0c;而是一個 HTMLCollection 解決 使用document.querySelector…

Dart 逆襲之路:Flutter 4.0 如何推動移動端開發變革?

本文深入探討 Dart 語言在 Flutter 4.0 框架下如何推動移動端開發變革。開篇回顧 Dart 誕生背景與初期困境&#xff0c;闡述其在與 Flutter 結合后嶄露頭角。進而詳細剖析 Flutter 4.0&#xff0c;從全新渲染引擎帶來的性能飛躍、豐富實用新組件簡化開發&#xff0c;到手勢系統…

基于MATLAB的卷積神經網絡手寫數字識別

一、系統架構設計 #mermaid-svg-QQU8judlmQgHc2Lh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QQU8judlmQgHc2Lh .error-icon{fill:#552222;}#mermaid-svg-QQU8judlmQgHc2Lh .error-text{fill:#552222;stroke:#5…

從廢棄到珍寶——舊物二手回收小程序系統的價值發現之旅

在我們的生活中&#xff0c;總有一些舊物因為各種原因而被遺棄在角落&#xff0c;它們或許不再新潮&#xff0c;或許不再實用&#xff0c;但它們卻承載著我們的記憶和情感。舊物二手回收小程序系統的出現&#xff0c;讓這些被遺忘的舊物重新煥發了生機&#xff0c;開啟了一段從…

從0開始學習Java+AI知識點總結-16.web基礎知識

一、SpringBoot Web 入門開發SpringBoot 簡化了傳統 Spring 應用的配置流程&#xff0c;通過 "約定大于配置" 的理念實現快速開發。以下是入門核心要點&#xff1a;1. 工程創建與依賴配置工程初始化&#xff1a;通過 Spring Initializr 創建工程&#xff0c;選擇Spri…

代碼隨想錄Day51:圖論(島嶼數量 深搜廣搜、島嶼的最大面積)

一、實戰 99島嶼數量 深搜 99. 島嶼數量 本題中每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成&#xff0c;也就是說斜角度鏈接是不算的。思路是用遇到一個沒有遍歷過的節點陸地&#xff0c;計數器就加一&#xff0c;然后把該節點陸地所能遍歷到的陸地都標記上。在…

讀取數據excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[時間], datetime):…

前端環境安裝

1.vsCode 下載鏈接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一個wiz code擴展&#xff08;提示你需要升級的依賴&#xff09; wiz code 使用方法 效果 2.git 下載鏈接&#xff1a;Git - Downloads 先下載 Homebrew&#xff08;https://brew.sh/ &a…

零基礎學Java第十八講---抽象類和接口(3)

續接上一講 目錄 一、內部類 1、內部類的分類 2、靜態內部類 3、實例內部類---未被static修飾的成員內部類 4、局部內部類 5、匿名內部類 二、Object類 1、獲取對象信息 2、equals方法 3、hashcode方法 一、內部類 當?個事物的內部&#xff0c;還有?個部分需要?個…

字節數據流

記錄 干貨&#xff5c;8000字長文&#xff0c;深度介紹Flink在字節跳動數據流的實踐 字節跳動基于Flink的MQ-Hive實時數據集成