C# 静态类,高手不想让你知道的 15 个真相

Coding-130

前言

嗨,大家好!

在 C# 面向对象编程的海洋中,类(Class)是支撑我们代码的重要基石,而静态类则是这个基础中的一块璞玉。你可能在编程的旅途中听说或使用过静态类,它到底是什么呢?

简单来说,如果一个类里仅包含静态成员和静态方法,那它就可以被称为静态类,通常我们会用 static 修饰符来标识它,例如:

/// <summary>
/// 使用 static 修饰符定义静态类
/// </summary>
static class StaticDemo
{    
    // 声明静态字段
    private static string staticString = "static string";

    // 声明静态属性
    public static string StaticString
    {
        get { return staticString; }
        set { staticString = value; }
    }
    
    // 实现静态方法
    public static void ShowMsg()
    {
        Console.WriteLine(StaticString);
    }

    public static void Main()
    {
        // 访问静态方法
        // 为了演示,这里使用 类.方法 的方式访问,实际开发中是不需要的
        StaticDemo.ShowMsg();
    }
}

接下来,我将和大家分享我总结的关于使用静态类的15个经验,希望能为你的项目带来灵感和帮助!

使用经验总结

1. 保持纯粹

如果一个类只包含静态成员和静态方法,建议最好将它标记为 static,并声明一个私有构造函数,以防止其他程序员在类的范围之外实例化类的实例。

2. 天然密封

编译器会自动将静态类标记为密封类(sealed),这意味着它不能被继承,确保了其成员的安全性和不可变性。

3. 静态构造函数

静态类可以包含静态构造函数,用于初始化类中的静态成员,包括静态字段和静态属性,但只能执行一次,要注意的是,静态构造函数不能带参数和访问修饰符如 public,比如:

static StaticDemo() 
{
    staticString = "静态字符串";
}

静态字段可以在声明时初始化,也可以通过静态构造函数进行初始化,静态构造函数会覆盖声明时的初始化值。

一般来说,简单的静态成员在声明时进行初始化即可,复杂的静态成员才建议选择在静态构造函数中进行初始化。

4. 简化访问

静态属性和静态方法只能由类自身访问,这使得直接通过类名调用静态方法,无需实例化对象,从而让代码调用变得更加简单

5. 调用快速

由于无需实例化,静态方法的调用速度往往更快。

6. 内存使用效率高

静态类只有一个实例,所以相对于多个实例来说,它在内存使用上更为高效,能够用更少的内存存储相同的功能,就像一个精明的家庭主妇,总是能把每一分钱都花在刀刃上

7. 编译期绑定

静态方法是在编译期绑定的,这意味着它们在运行时不需要额外的查找和解析过程,从而提高了性能

8. 常驻内存

静态方法和字段是常驻内存的,这意味着它们在整个程序运行期间都会占用内存空间。所以,用得着的时候它们就在那儿,用不着的时候……它们也在那儿。

9. 不能引用 this

普通类中的静态方法不能引用 this 关键字访问,否则会引起编译时错误

10. 不能被虚拟化和覆写

普通类中的静态方法不能被标记为 virtualabstract 或者 override,可以被派生类访问,但是不能被派生类覆写,就像是一首经典老歌,你只能欣赏,不能篡改

11. 无法实现接口

静态类无法实现接口,因为 CLS(通用语言规范)不允许接口有静态成员,这一点在实际开发之中可能会给语言之间的交互带来问题

12. 全局共享

静态类的成员在应用程序的所有实例中共享。这使得静态类非常适合执行全局工具函数的场景,例如:

  • 工具类:静态类常用于实现工具函数,如数学计算、字符串处理等
  • 线程池:静态类可以用于管理线程池,提供全局的线程管理功能
  • 全局服务:静态类可以用于提供全局的服务或配置,如常量、日志记录、配置管理等

13. 线程安全

使用静态类时要注意,必须确保它们是线程安全的,在多线程环境中,静态变量可能会导致数据不一致。

建议在多线程中,在访问静态成员时,使用 lock 关键字来确保同一时间只有一个线程能够访问该成员,比如:

private static object _lock = new object();
public static void SomeMethod()
{
    lock (_lock)
    {
        // 执行线程安全的操作
    }
}

这种方法可以有效地防止多个线程同时修改静态成员导致的数据不一致问题。

14. 谨慎使用集合

如果静态类中需要使用集合类(如 List<T>),建议使用 C# 提供的线程安全集合类,例如 ConcurrentBag<T>ConcurrentQueue<T>。这些集合类在多线程环境下自动处理并发操作,避免数据损坏。

15. 避免过度使用

过度使用静态类可能导致代码耦合度过高,降低代码的可维护性,建议按需使用静态类

最后

静态类在 C# 中是一个强大的特殊类,了解它的特性和最佳实践,可以帮助我们在项目中更有效地利用它的优势,让它发挥更大的作用!

好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号,更多干货等你来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值