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代码中。
  • 不可变性:必须在声明时赋值,且只能为基本类型(如intstring)或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.mzph.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 ☘️…