当前位置: 首页 > wzjs >正文

门户网站 技术方案网站搭建公司哪家好

门户网站 技术方案,网站搭建公司哪家好,哈尔滨市住建委官网,wordpress disable embds本文仅作为参考大佬们文章的总结。 Static关键字是C#语言中一个基础而强大的特性,它能够改变类成员的行为方式和生命周期。本文系统性总结static关键字的各类用法、核心特性、适用场景以及需要注意的问题,以帮助掌握这一重要概念。 一、Static关键字概…

本文仅作为参考大佬们文章的总结。

Static关键字是C#语言中一个基础而强大的特性,它能够改变类成员的行为方式和生命周期。本文系统性总结static关键字的各类用法、核心特性、适用场景以及需要注意的问题,以帮助掌握这一重要概念。

一、Static关键字概述

Static是C#中的一个修饰符,用于声明属于类型本身而不是特定对象的成员。使用static修饰的成员与类相关联,而不是与类的实例相关联。这意味着:

  • ​类级别存储​​:静态成员在内存中只有一份拷贝,无论创建多少个类的实例

  • ​直接访问​​:可以通过类名直接访问静态成员,无需创建类的实例

  • ​共享性​​:所有实例共享同一个静态成员,修改一处会影响所有使用该成员的地方

静态成员包括静态类、静态方法、静态属性、静态字段和静态构造函数等。

二、Static的核心用法

1. 静态类(Static Class)

静态类是完全由静态成员组成的类,使用static关键字修饰类定义。

​主要特性​​:

  • 不能被实例化(不能使用new关键字创建对象)

  • 不能被继承(本质是密封类)

  • 只能包含静态成员

  • 不能包含实例构造函数

​典型应用场景​​:

  • 工具类(如数学计算、字符串处理等)

  • 全局常量定义

  • 辅助方法容器

​示例代码​​:

public static class MathUtils 
{public static double PI = 3.14159;public static double CircleArea(double radius) {return PI * radius * radius;}
}
// 调用方式
double area = MathUtils.CircleArea(5.0);

静态类编译器会自动将其标记为sealed,防止被继承,同时确保不会意外添加实例成员。

2. 静态成员(Static Members)

静态成员包括静态字段、静态属性和静态方法等,它们属于类本身而非实例。

​静态字段​​:

public class Counter 
{public static int Count = 0; // 静态字段public void Increment() {Count++; // 所有实例共享同一个Count}
}

​静态属性​​:

public class AppSettings 
{private static string _connectionString;public static string ConnectionString {get { return _connectionString; }set { _connectionString = value; }}
}

​静态方法​​:

public class StringHelper 
{public static string Reverse(string str) {char[] charArray = str.ToCharArray();Array.Reverse(charArray);return new string(charArray);}
}

静态方法不能直接访问实例成员,但可以通过传递对象引用来间接访问。同样,静态方法中不能使用this关键字,因为没有当前实例对象。

3. 静态构造函数(Static Constructor)

静态构造函数用于初始化静态成员,在类第一次被使用时自动调用,且只执行一次。

​特点​​:

  • 没有访问修饰符(隐式private)

  • 没有参数

  • 不能被直接调用

  • 在以下情况自动触发:

    • 创建第一个实例时

    • 访问任意静态成员时

​示例​​:

public class Logger 
{static Logger() {Console.WriteLine("静态构造函数执行");// 初始化日志文件路径等操作}public Logger() {// 实例构造函数}
}

静态构造函数与实例构造函数的执行顺序值得注意:当类第一次被加载时,会先为所有静态变量分配内存并初始化,然后执行静态构造函数,最后才是实例构造函数。

4. 局部静态变量(Local Static Variables)

C# 9.0引入了局部静态变量,它在方法作用域内声明,但生命周期跨越多次方法调用。

​特点​​:

  • 超出方法作用域仍保持值

  • 跨方法调用持久存储

  • 初始化在首次方法调用时完成

​示例​​:

public void TrackExecution() 
{static int executionCount = 0; // C# 9+局部静态变量executionCount++;Console.WriteLine($"方法已执行 {executionCount} 次");
}

三、Static的内存管理与生命周期

理解静态成员的内存管理对编写高效程序至关重要。

1. 存储位置

静态成员存储在​​全局数据区​​(静态存储区),而不是堆或栈中。具体来说:

  • ​静态全局变量​​:在全局数据区分配内存,如果不显式初始化会被隐式初始化为0

  • ​静态局部变量​​:同样在全局数据区分配内存,但作用域限于定义它的函数或语句块

  • ​静态数据成员​​:在程序全局数据区分配,被类的所有实例共享

2. 生命周期

静态成员的生命周期与应用程序域(AppDomain)相同:

  • ​初始化时机​​:程序启动时初始化(对于显式初始化的静态成员)或首次访问时初始化(对于延迟初始化的静态成员)

  • ​释放时机​​:应用域卸载时释放

3. 垃圾回收(GC)规则

  • 非静态类中的静态字段可能被垃圾回收

  • 静态类通常不会被GC回收(驻留内存)

​内存泄漏风险示例​​:

public class Cache 
{static List<byte[]> _cache = new List<byte[]>();public static void AddData(byte[] data) {_cache.Add(data); // 内存泄漏风险!}
}

这个Cache类使用静态列表存储数据,但数据永远不会被移除,可能导致内存不断增长。

四、Static的典型应用场景

1. 工具类和实用方法

静态类非常适合包含一组相关的工具方法:

public static class FileHelper 
{public static bool FileExists(string path) {return File.Exists(path);}public static string ReadAllText(string path) {return File.ReadAllText(path);}
}

2. 全局配置和常量

静态变量适合存储全局配置信息:

public class GlobalConfig 
{public static string DatabaseConnectionString { get; set; } = "your_connection_string";public static int MaxRetryCount { get; set; } = 3;
}

3. 单例模式(Singleton)

静态变量常用于实现单例模式:

public class Singleton 
{private static Singleton _instance;private Singleton() { }public static Singleton Instance {get {if (_instance == null) {_instance = new Singleton();}return _instance;}}
}

4. 计数器和共享状态

静态字段可用于实现计数器:

public class VisitorCounter 
{public static int Count { get; private set; } = 0;public static void Increment() {Count++;}
}

5. 数学计算和常量

静态类适合定义数学常量和计算方法:

public static class MathConstants 
{public static double PI = 3.141592653589793;public static double E = 2.718281828459045;public static double RadiansToDegrees(double radians) {return radians * (180.0 / PI);}
}

五、使用Static的注意事项

1. 线程安全问题

静态成员在​​多线程环境​​下可能导致数据竞争和不一致。需要采取同步措施:

public class ThreadSafeCounter 
{private static int _count = 0;private static readonly object _lock = new object();public static void Increment() {lock (_lock) {_count++;}}
}

2. 静态与实例成员的交互规则

  • ​静态方法中​​:

    • 可以直接访问静态成员

    • 不能直接访问实例成员(除非传递对象引用)

    • 不能使用thisbase关键字

  • ​实例方法中​​:

    • 可以访问静态成员和实例成员

3. 初始化顺序问题

静态成员的初始化顺序可能导致意外行为:

class Program 
{static int i = getNum();int j = getNum();static int num = 1;static int getNum() { return num; }static void Main(string[] args) {Console.WriteLine($"i={i}"); // 输出0Console.WriteLine($"j={new Program().j}"); // 输出1}
}

这是因为类加载时,先为所有静态变量分配内存(初始化为0),然后按顺序执行赋值操作。

4. 过度使用的风险

虽然static可以简化代码,但过度使用可能导致:

  • ​代码耦合度高​​:静态成员形成全局状态,使代码难以模块化和测试

  • ​内存压力​​:长期驻留内存的静态成员可能导致内存压力

  • ​可测试性差​​:静态成员难以模拟和替换,不利于单元测试

六、Static与相关概念的比较

1. 静态类 vs 私有构造函数

两者都可以防止类被实例化,但有重要区别:

特性

静态类

私有构造函数类

实例化

完全禁止

类内部仍可实例化

成员

只能有静态成员

可以有实例成员

继承

不能继承

可以继承

编译器检查

编译器确保无实例成员

无此保证

2. 静态成员 vs 常量(const)

虽然const字段行为类似静态,但有重要区别:

特性

静态字段

常量(const)

内存位置

静态存储区

编译时确定

修改性

可修改

不可修改

初始化时机

运行时

编译时

类型限制

任意类型

仅限基元类型、string等

3. 静态方法 vs 实例方法

特性

静态方法

实例方法

调用方式

通过类名

通过实例

访问权限

只能访问静态成员

可访问静态和实例成员

this关键字

不可用

可用

多态支持

可重载,不可重写

可重载和重写

七、性能优化建议

频繁访问的工具方法、线程安全的状态共享、日志记录器等通用组件可以合理使用static可以提升性能,但需注意以下原则:

优先考虑实例成员处理对象状态

避免在静态字段中存储大对象

使用Lazy<T>实现延迟初始化

​延迟初始化示例​​:

public class ConfigLoader 
{private static readonly Lazy<Config> _config = new Lazy<Config>(() => LoadConfig());public static Config Instance => _config.Value;private static Config LoadConfig() {// 加载配置的耗时操作}
}
  • 缓存考虑​​:

    • 对于计算成本高的静态方法,考虑缓存结果

    • 注意缓存的生命周期和清理策略

八、总结

Static关键字是C#中一个功能强大但需要谨慎使用的特性。实现了以下价值

  • ​资源共享​​:在类的所有实例间共享数据和功能

  • ​直接访问​​:无需实例化即可使用类提供的功能

  • ​性能优化​​:减少重复实例化和内存分配

在以下实践中可以使用Static

  1. ​明确用途​​:只为真正需要类级别共享的成员使用static

  2. ​线程安全​​:多线程环境下使用静态成员必须考虑同步

  3. ​初始化顺序​​:注意静态成员的初始化顺序可能带来的影响

  4. ​内存管理​​:避免使用静态字段存储可能无限增长的数据集合

  5. ​可测试性​​:尽量减少静态依赖,提高代码的可测试性

在选择是否使用static时,可参考以下决策路径:

  1. 该功能是否需要访问实例状态?

    • 是 → 使用实例成员

    • 否 → 考虑静态成员

  2. 该数据是否需要跨实例共享?

    • 是 → 考虑静态字段

    • 否 → 使用实例字段

  3. 该方法是否表示与类型相关而非实例相关的行为?

    • 是 → 考虑静态方法

    • 否 → 使用实例方法

参考

  1. c# static关键字的用法是什么
  2. 详解C#中的static关键字的五大核心用法
  3. C#中static的详细用法实例
  4. c# static有哪些应用场景
  5. static c#方法的正确使用方式
http://www.dtcms.com/wzjs/282414.html

相关文章:

  • 网站 经营性网络营销策划
  • 定西市建设局网站百中搜优化软件
  • b2c旅游网站建设个人网页怎么做
  • 网易企业邮箱服务吉林刷关键词排名优化软件
  • 网站模糊背景互联网公司排名
  • 有人知道网站怎么做吗网络软文推广案例
  • 龙之向导外贸官方网站首页图片点击率如何提高
  • 苏州设计网站站长工具如何使用
  • wordpress 测速重庆优化seo
  • 云南住房和城乡建设部网站seo全网推广营销软件
  • 东莞公司网站设计网站的seo
  • 能自己在家做网站吗推广网站要注意什么
  • 阿里巴巴国际站网页设计教程电话销售如何快速吸引客户
  • 网站做可信认证推广赚钱app哪个靠谱
  • 网站上的报名表链接是怎么做的刚刚地震最新消息今天
  • 云主机网站的空间在哪云计算培训
  • 上海松江网站设计公司优化网站关键词排名软件
  • 做网站怎样用链接赚钱海南网站推广
  • 新闻网站寄生虫怎么做googleplay安卓版下载
  • 网站如何做电脑销售卡点视频软件下载
  • 定制网站建设济南百度地图推广
  • 做网站太麻烦了网站建设找哪家公司好
  • wordpress 访问记录插件天津seo代理商
  • 邢台专业做网站公司营销软文模板
  • 网站建设 秦皇岛公司哪家好宁波seo超级外链工具
  • 京东网站建设及特点留手机号广告
  • 长沙 网站建设公司百度浏览器官方网站
  • 抚宁区建设局网站产品怎么做市场推广
  • 网站建设员招聘网络营销的现状分析
  • 学院的网站怎么做百度seo优化排名软件