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

news2025/6/2 7:47:39

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.coloradmin.cn/o/2393684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验设计与分析(第6版,Montgomery)第4章随机化区组,拉丁方, 及有关设计4.5节思考题4.18~4.19 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第章随机化区组&#xff0c;拉丁方&#xff0c; 及有关设计4.5节思考题4.18~4.19 R语言解题。主要涉及方差分析&#xff0c;拉丁方。 batch <- c(rep("batch1",5), rep(&quo…

【吾爱】逆向实战crackme160学习记录(一)

前言 最近想拿吾爱上的crackme程序练练手&#xff0c;发现论坛上已经有pk8900总结好的160个crackme&#xff0c;非常方便&#xff0c;而且有很多厉害的前辈已经写好经验贴和方法了&#xff0c;我这里只是做一下自己练习的记录&#xff0c;欢迎讨论学习&#xff0c;感谢吾爱论坛…

vue2 + webpack 老项目升级 node v22 + vite + vue2 实战全记录

前言 随着这些年前端技术的飞速发展&#xff0c;几年前的一些老项目在最新的环境下很可能会出现烂掉的情况。如果项目不需要升级&#xff0c;只需要把编译后的文件放在那里跑而不用管的话还好。但是&#xff0c;某一天产品跑过来给你讲要升级某一个功能&#xff0c;你不得不去…

STM32的HAL编码流程总结(上部)

目录 一、GPIO二、中断系统三、USART串口通信四、I2C通信五、定时器 一、GPIO 1.选择调试类型 在SYS中Debug选择Serial Wire模式 2.选择时钟源 在RCC中将HSE和LSH都选择为内部晶振 3.时钟树配置 4.GPIO配置 在芯片图上选择开启的引脚和其功能 配置引脚的各自属性 5.工…

深度学习|pytorch基本运算

【1】引言 pytorch是深度学习常用的包&#xff0c;顾名思义&#xff0c;就是python适用的torch包&#xff0c;在python里面使用时直接import torch就可以调用。 需要注意的是&#xff0c;pytorch包与电脑配置、python版本有很大关系&#xff0c;一定要仔细阅读安装要求、找到…

替代 WPS 的新思路?快速将 Word 转为图片 PDF

在这个数字化办公日益普及的时代&#xff0c;越来越多的人开始关注文档处理工具的功能与体验。当我们习惯了某些便捷操作时&#xff0c;却发现一些常用功能正逐渐变为付费项目——比如 WPS 中的一项实用功能也开始收费了。 这款工具最特别的地方在于&#xff0c;可以直接把 W…

【K8S】K8S基础概念

一、 K8S组件 1.1 控制平面组件 kube-apiserver&#xff1a;公开 Kubernetes HTTP API 的核心组件服务器。 etcd&#xff1a;具备一致性和高可用性的键值存储&#xff0c;用于所有 API 服务器的数据存储。 kube-scheduler&#xff1a;查找尚未绑定到节点的 Pod&#xff0c;并将…

包含Javascript的HTML静态页面调取本机摄像头

在实际业务开发中&#xff0c;需要在带有摄像头的工作机上拍摄施工现场工作过程的图片&#xff0c;然后上传到服务器备存。 这便需要编写可以运行在浏览器上的代码&#xff0c;并在代码中实现Javascript调取摄像头、截取帧保存为图片的功能。 为了使用户更快掌握JS调取摄像头…

PCB设计实践(三十一)PCB设计中机械孔的合理设计与应用指南

一、机械孔的基本概念与分类 机械孔是PCB设计中用于实现机械固定、结构支撑、散热及电气连接的关键结构元件&#xff0c;其分类基于功能特性、制造工艺和应用场景的差异&#xff0c;主要分为以下几类&#xff1a; 1. 金属化机械孔 通过电镀工艺在孔内壁形成导电层&#xff0c;…

【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)

本篇文章将以一个小白视角&#xff0c;通俗易懂带你了解信号在产生&#xff0c;保存之后如何进行捕捉&#xff1b;以及在信号这个话题中&#xff1b;OS扮演的角色及背后是如何进行操作的&#xff1b;如何理解用户态内核态&#xff1b;还有一些可以引出的其他知识点&#xff1b;…

多功能秒达开源工具箱源码|完全开源的中文工具箱

源码介绍 完全开源的中文工具箱永远的自由软件轻量级运行全平台支持&#xff08;包括ARMv8&#xff09;类似GPT的智能支持高效UI高度集成提供Docker映像和便携式版本支持桌面版开源插件库 下载地址 百度网盘下载 提取码&#xff1a;p9ck ▌本文由 6v6-博客网 整理分享 ▶ 更多…

用nz-tabel写一个合并表格

用nz-tabel写一个合并表格 <nz-table #basicTable [nzData]"tableSearchStatus.dataList" nzBordered><thead><tr><th>班级</th><th>姓名</th><th>年龄</th><th>电话</th></tr></thead&…

leetcode hot100刷题日记——29.合并两个有序链表

解答&#xff1a; 方法一&#xff1a;递归 递归的边界条件是啥呢&#xff1f; 递归别想那么多具体步骤&#xff0c;考虑大步骤&#xff0c;小的递归自己会去做的 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//递归比较大小//先考虑…

【计算机网络】第1章:概述—分组延时、丢失和吞吐量

目录 一、分组延时、丢失 1. 节点处理延时&#xff1a; 2. 排队延时&#xff1a; 3. 传输延时: 4. 传播延时: 5. 节点延时 6. 排队延时 7. 分组丢失 二、吞吐量 三、总结 &#xff08;一&#xff09;分组延时 1. 处理延时&#xff08;Processing Delay&#xff09; …

DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?

DeepSeek-R1‑0528 技术剖析&#xff1a;思维链再进化&#xff0c;推理性能飙升 目录 版本概览深度思考能力再升级基准测试成绩功能与体验更新API 变动与示例模型开源与下载结语 版本概览 DeepSeek 团队今日发布 DeepSeek‑R1‑0528 —— 基于 DeepSeek V3 Base&#xff08;2…

SQL正则表达式总结

这里写目录标题 一、元字符二、正则表达函数1、 regexp_like(x,pattern[,match_option])2、 regexp_instr(x,pattern[,start[,occurrence[,return_option[, match_option]]]]) 3、 REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]]) 4、 REGEXP_REPLACE(x,patter…

力扣经典算法篇-13-接雨水(较难,动态规划,加法转减法优化,双指针法)

1、题干 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

STM32 -- USB虚拟串口通信

本篇操作: 通过CubeMX Keil&#xff0c;配置STM32作为USB设备端&#xff0c;与电脑上位机进行通信&#xff08;CDC&#xff09;&#xff1b;通用带USB功能的 STM32 芯片 &#xff08;如F1、F4等&#xff0c;系统时钟配置不同&#xff0c;代码通用&#xff09;。 目录 一、 S…

uni-app开发特殊社交APP

uni-app开发特殊社交APP 目录 1.展示APP功能 2.展示项目结构 3.关于我的GitHub 引言 博主最近自己在GitHub上面上传了一个关于社交软件的项目&#xff08;该项目早已开发完毕&#xff09;, 这个社交软件比较特殊, 被称之为blind-date&#xff0c; blind-date 是基于 uni-…

Linux中Shell脚本的常用命令

一、设置主机名称 1、通过修改系统文件来修改主机名称 [rootsakura1 桌面]# vim /etc/hostname sakura /etc/hostname&#xff1a;Linux 系统中存储主机名的配置文件。修改完文件后&#xff0c;在当前的shell中是不生效的&#xff0c;需要关闭当前shell后重新开启才能看到效…