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

20250529-C#知识:静态类、静态构造函数和拓展方法

C#知识:静态类、静态构造函数和拓展方法

静态类一般用来编写工具类


1、静态类

  • 用static关键字修饰的类
  • 一般充当工具类
  • 只能包含静态成员,不能包含静态索引器
  • 不能被实例化
  • 静态方法只能使用静态成员
  • 非静态方法既可以使用非静态成员,也可以使用静态成员
    static class Tools{static private string name;  //静态成员变量public static string[] versions;public static Dog toolDog;  //非静态类型的静态成员变量static public int Count => versions.Length; //静态属性//static public int this[int idx]//{//}static Tools()  //静态构造{name = "驴子牌工具包";versions = new string[]{ "1.1", "2.1", "3.5"};toolDog = new Dog("波奇");    //非静态类型实例化Console.WriteLine("静态类构造被调用!");}public static string GetDogName() => toolDog.littleName; //静态成员方法     }

2、静态构造函数

  • 加了static关键字修饰的构造函数
  • 可以出现在静态类和非静态类中
  • 不能有访问修饰符
  • 不能有参数
  • 只会调用一次
  • 静态类中的静态构造一般在其成员被使用之前被自动调用
  • 非静态类的静态构造一般在实例化对象或使用静态成员之前被自动调用
  • 一般用来初始化静态成员变量
        static Tools()  //静态类中的静态构造函数{name = "驴子牌工具包";versions = new string[]{ "1.1", "2.1", "3.5"};toolDog = new Dog("波奇");    //非静态类型实例化Console.WriteLine("静态类中的静态类构造被调用!");}
        static Dog() //非静态类中的静态构造函数{name = "布莱恩";Console.WriteLine("非静态类中的静态类构造被调用!");} 

3、拓展方法

  • 为非静态类添加方法
  • 形式上是静态类中的静态方法
  • 语法 访问修饰符 static 返回值 拓展方法名(this 要拓展的类 使用拓展方法的实例化对象, 参数类型 参数1, 参数类型 参数2,…)
  • 好处方便给封装好的类添加新的方法,不用修改类代码,不用写一个继承类
        //私有拓展private static void Speak2(this Dog dog) => Console.Write("喵喵喵");//公有拓展public static void Speak3(this Dog dog, string word){Console.Write("{0}:", Dog.name);    //非静态方法使用静态成员变量dog.Speak1();dog.Speak2();   //调用另外一个拓展方法Console.WriteLine(word);}//为float类型拓展方法public static void MyFunc(this float target) => Console.WriteLine("这是为float拓展的方法");

4、静态成员变量 VS const成员变量

  • const成员变量必须初始化,静态成员变量不需要
  • const只能修饰变量
  • const关键字只能位于访问修饰符后面

5、完整代码示例:

using System.Runtime.CompilerServices;namespace LearnStatic
{static class Tools{static private string name;  //静态成员变量public static string[] versions;public static Dog toolDog;  //非静态类型的静态成员变量static public int Count => versions.Length; //静态属性//static public int this[int idx]//{//}static Tools()  //静态类中的静态构造函数{name = "驴子牌工具包";versions = new string[]{ "1.1", "2.1", "3.5"};toolDog = new Dog("波奇");    //非静态类型实例化Console.WriteLine("静态类中的静态类构造被调用!");}public static string GetDogName() => toolDog.littleName; //静态成员方法//私有拓展private static void Speak2(this Dog dog) => Console.Write("喵喵喵");//公有拓展public static void Speak3(this Dog dog, string word){Console.Write("{0}:", Dog.name);    //非静态方法使用静态成员变量dog.Speak1();dog.Speak2();   //调用另外一个拓展方法Console.WriteLine(word);}//为float类型拓展方法public static void MyFunc(this float target) => Console.WriteLine("这是为float拓展的方法");}class Dog{public static string name;public string littleName;public Dog() => Console.WriteLine("非静态类的无参构造被调用");public Dog(string name) => this.littleName = name;static Dog() //非静态类中的静态构造函数{name = "布莱恩";Console.WriteLine("非静态类中的静态类构造被调用!");}   public void Speak1() => Console.Write("旺旺旺");}internal class Program{static void Main(string[] args){//Console.WriteLine(Dog.name);    //非静态类中的静态类构造被调用!   布莱恩//Console.WriteLine("*************");Dog dog = new Dog();    //非静态类中的静态类构造被调用!   非静态类的无参构造被调用Console.WriteLine("*************");dog.Speak1();   //旺旺旺Console.WriteLine("*************");//调用拓展方法,拓展方法是非静态方法dog.Speak3("你喜欢我写的小说吗?");       //静态类中的静态类构造被调用!//布莱恩:旺旺旺喵喵喵你喜欢我写的小说吗?Console.WriteLine(Tools.toolDog.littleName);    //波奇float f1 = 0.36f;f1.MyFunc();    //这是为float拓展的方法}}
}

6、参考资料

  1. 《唐老狮C#》

本篇结束,感想您的阅读~

在这里插入图片描述

http://www.lryc.cn/news/2393684.html

相关文章:

  • 实验设计与分析(第6版,Montgomery)第4章随机化区组,拉丁方, 及有关设计4.5节思考题4.18~4.19 R语言解题
  • 第十篇:MySQL 实战:数据迁移、分库分表与分区技术指南
  • 【吾爱】逆向实战crackme160学习记录(一)
  • vue2 + webpack 老项目升级 node v22 + vite + vue2 实战全记录
  • opengauss 数据库安装主备 非om方式
  • STM32的HAL编码流程总结(上部)
  • 深度学习|pytorch基本运算
  • (自用)Java学习-5.15(模糊搜索,收藏,购物车)
  • 替代 WPS 的新思路?快速将 Word 转为图片 PDF
  • 【K8S】K8S基础概念
  • FEMFAT许可分析的数据可视化方法
  • 打印机无法远程打印?可以本地打印,本地网络打印机设置给异地使用
  • 包含Javascript的HTML静态页面调取本机摄像头
  • PCB设计实践(三十一)PCB设计中机械孔的合理设计与应用指南
  • deepseek问答记录:请讲解一下torch.full_like()
  • 【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)
  • 多功能秒达开源工具箱源码|完全开源的中文工具箱
  • 如何在腾讯云 OpenCloudOS 上安装 Docker 和 Docker Compose
  • 清理skywalking历史索引
  • 用nz-tabel写一个合并表格
  • matlab计算转子系统的固有频率、振型、不平衡响应
  • leetcode hot100刷题日记——29.合并两个有序链表
  • 【机器人】具身导航 VLN 最新论文汇总 | Vision-and-Language Navigation
  • Windows 安装 WSL2 并运行 Ubuntu 22.04 指南
  • AI情感陪伴在医疗领域的核心应用潜力
  • 【计算机网络】第1章:概述—分组延时、丢失和吞吐量
  • Python Day38
  • DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?
  • 线路板厂家遇到的PCB元件放置的常见问题有哪些?
  • 【C/C++】无限长有序数组中查找特定元素