【从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实时数据集成