C# Static与拓展方法

我们可以使用 static 关键字把类和类成员定义为静态的。
作用

  • 静态成员让类的所有实例化对象之间实现数据共享。
  • 实现成员变量的唯一性,这在单例模式中常用到。
  • 静态类可以作为工具类提供方法

特点

  • 使类成员作为类的成员存在,而不依赖于类的实例化对象。
  • 类,子类,类实例化对象,子类的实例化对象共用一个成员变量。
  • 静态类不可被实例化,不可被继承,只能包含静态成员。
  • 静态构造函数只能用来对类的静态成员变量初始化(不能对静态成员变量初始化),不能被外部调用,并且在类第一次被使用时自动调用。

静态成员变量

class MyClass
{public static int age; //访问修饰符 static 数据类型 变量名
}

当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个静态成员。且如果该类被其他类继承,该类和其他子类都共用这个静态成员。静态成员在编译阶段已经存在,且在整个程序周期内一直存在,直到整个程序被关闭。静态成员属于类,类的静态成员变量常用于用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。(当然类的实例化对象也可以获取静态成员)当静态成员变量没有初始化时,系统会生成一个默认静态构造函数为静态成员变量赋值(数值类型是0,引用类型是null)。

static void Main(string[],args)
{Console.WriteLine(myClass.age);//直接用 类名.变量名 使用
}

基类子类共用一个静态成员

class BaseClass
{public static int age = 10;
}class MyClass:BaseClass
{}static void Main(string[],args)
{Console.WriteLine(MyClass.age)//输出10MyClass.age = 100;Console.WriteLine(BaseClass.age)//输出100
}
//MyClass和BaseClass中的age是同一个

静态成员函数

class MyClass
{public static int age;public static int GetAge() //访问修饰符 static 返回值数据类型 函数名(参数列表){return age;}
}

和静态成员变量相同,类的静态成员函数也是属于类的,可以直接通过类来调用。此外,静态函数中只能使用静态成员变量(不能使用普通的成员变量)。因为普通的成员变量只有在类实例化对象时才分配内存,当调用静态成员函数时不能去使用没有分配内存的成员变量。静态成员函数中不能使用this关键字。(this代表实例化对象,而静态方法中可以不存在实例化对象)。

静态类

static class MyClass //static class 类名
{}

**静态类不能被实例化,不能被继承,只能包含静态成员。**静态类可以作为提供一些公共静态方法的工具类,例如Console就是一个静态类。

静态构造函数

class MyClass
{public static int age;static MyClass() //static 类名(){age = 10;//初始化静态变量}
}

静态构造函数用来为类的静态变量初始化,不可被外部调用,没有参数,当类第一次使用时会自动调用。静态类和普通类中都可存在静态构造函数。

拓展方法
为现有的非静态变量类型(自定义的非静态类类,int,string,结构体等)添加新方法。

特点
扩展方法需要写在静态类中,并且是静态方法。

static class Tools
{public static void NewFunc(this int value,...)//访问修饰符 static 返回值类型 方法名(this 被添加新方法的变量类型(可以是自定义的类,string,结构体,int等) 被添加新方法的变量类型的对象,参数列表){//方法逻辑}
}

使用

class MyClass
{public string name = "MyClass";public void Func1(){Console.WriteLine("这里是Func1);}
}static class Tools //必须写在静态类中为非静态类型添加方法(MyClass不能是静态类)
{//为int类型添加无参数的Speak方法public static void Speak(this int value)//没有参数{Console.WriteLine("我是int类型,我的值为"+value);//这里的value就代表下面的number}//为int类型添加无参数的Speak方法public static void SpeakString(this int value,string str)//有参数{Console.WriteLine("我是int类型,我的值为"+value+" 传的参数为"+str);//这里的value就代表下面的number}//为自定义类MyClass添加有参数的Func2方法public static void Func2(this MyClass myClass,string str)//有参数{Console.WriteLine("我是" + str + " 我的类名为"+myClass.name);}
}class Program
{static void Main(string[],args){int number = 10;number.Speak();//输出 我是int类型,我的值为10number.SpeakString("值类型");//输出 我是int类型,我的值为10 传的参数为值类型MyClass myClass = new MyClass();myClass.name = "MyClass";myClass.Func2("类");//输出 我是类 我的类名为MyClass}
}

在unity中使用

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//工具类
public static class Tools
{//为UnityEngine.UI.Image添加 设置图片 方法public static void SetIcon(this UnityEngine.UI.Image image,string res){image.sprite = Resources.Load<Sprite>($"Icon/{res}");}
}///
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class HeroItem : MonoBehaviour
{strint res = "Icon_1"void Start(){transform.Find("Icon").GetComponent<Image>().SetIcon(res);}
}

总结

  • 静态成员属于类,而不属于类的对象,使用类或者类对象都可以调用静态成员。
  • 基类和子类共用一个静态成员。
  • 静态成员函数只能使用静态成员变量,不能使用类的非静态成员变量。
  • 静态类不可被实例化,不可被继承,只能包含静态成员。
  • 静态构造函数只能用来对类的静态成员变量初始化(不能对静态成员变量初始化),不能被外部调用,并且在类第一次被使用时自动调用。
  • 拓展方法为现有的非静态变量类型(自定义的非静态类类,int,string,结构体等)添加新方法。
  • 扩展方法需要写在静态类中,并且是静态方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644897.shtml

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

相关文章

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及&#xff0c;越来越多的开发者和团队开始使用SVN&#xff08;Subversion&#xff09;来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程&#xff0c;帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

thymeleaf常用语法大全

有时候需要借鉴别人的代码&#xff0c;发现一个相似的功能点&#xff0c;但是自己的是html页面别人的是jsp页面&#xff0c;那如果不了解thymeleaf的话还是要费点功夫的。 什么是thymeleaf&#xff0c;通俗点&#xff0c;jsp中的${},以及jstl中的if标签什么的都不能用&#xf…

使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理 LlamaIndex的文档链接&#xff1a;Using LLMs - LlamaIndex &#x1f999; 0.9.33 LlamaIndex 的一般使用模式如下&#xff1a; 加载文档&#xff08;手动或通过数据加载器)将文档解析为节点构建索引&#xff08;来自节点或文档)&#xff08;可选&#xff0c;高级&…

GO 的 Web 开发系列(二)—— Web 项目的技术框架选择和项目搭建

Web 系统搭建第一步&#xff0c;选择技术框架&#xff0c;完成 Hello World。 小玖用的 Go 版本是 1.21.6 介绍项目的技术选型个结构&#xff0c;不包括代码。 全文链接&#xff1a;https://blog.nineya.com/archives/149.html 一、技术框架选择 Web 框架&#xff1a; githu…

2024年 IT 行业就业情况能否回春?很多人说道…

我只能说可以&#xff0c;以前我是看不到的。但是鸿蒙全栈自研让我重新看到希望&#xff01; 2024年1月18日&#xff0c;华为鸿蒙千帆启航发布会。讲到HarmonyOS NEXT作为原生鸿蒙&#xff0c;其系统底座全栈自研&#xff0c;去掉了传统的AOSP 代码&#xff08;“Android 开放…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中&#xff0c;快速插入参考文献 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的bib文件第二步&#xff1a;编辑overleaf模版方法二&#xff1a;EduBirdie生成参考文献&#xff08;补充&#xff09;使用LaTeX在Overleaf的IEEE会议…

杰卡德距离(Jaccard Distance)

杰卡德距离&#xff08;Jaccard Distance&#xff09;&#xff0c;是用于衡量两个集合差异性的一种指标&#xff0c;它是杰卡德相似系数的补集&#xff0c;可以用来区分集合&#xff08;如知识图谱&#xff09;。 杰卡德相似系数 杰卡德相似系数&#xff08;Jaccard similari…

012vuerouter

VUEROUTER3–vue2 vuerouter4–vue3 一个html可以切换多个组件&#xff0c;用户体验好很多 使用&#xff1a;导入-全局注册&#xff08;use import vuerouter from vuerouter Vue.use(vuerouter) vue-router有 < router-link > 并且使用< router-view>来声明路由…

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b1…

【MATLAB源码-第124期】基于matlab的GFDM系统(64QAM/QPSK调制)在AWGN和PA信道误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 广义频分复用&#xff08;GFDM&#xff09;是一种先进的信号调制技术&#xff0c;近年来在无线通信领域获得了广泛的关注。GFDM作为一种多载波调制方案&#xff0c;是对经典的正交频分复用&#xff08;OFDM&#xff09;技术的…

Java内存模型

主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则&#xff0c;即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量包括实例变量、静态字段和构成数组对象的元素&#xff0c;但不包括局部变量与方法参数&#xff0c;因为局部变…

什么是DMA?DMA究竟有多快!

原文来自公众号&#xff1a;工程师看海 直接内存访问&#xff08;Direct Memory Access&#xff0c;DMA&#xff09;&#xff1a;在计算机体系结构中&#xff0c;DMA 是一种数据传输方式&#xff0c;允许外部设备直接访问计算机的内存&#xff0c;而无需通过中央处理单元&#…

网络防御保护---防火墙USG6000V接口配置实验

一、实验拓扑 二、实验要求 1.防火墙向下使用子接口分别对应生产区和办公区 2.所有分区设备可以ping通网关 三、实验思路 1、配置各设备的IP地址 2、划分VLAN及VLAN的相关配置 3、配置路由及安全策略 四、实验配置 4.1、配置各设备IP地址 PC1配置 Client1配置 PC2配置…

maven搭建编程环境

Maven – Download Apache Mavenmaven下载官网地址下载后解压&#xff0c;配置系统环境变量&#xff0c; 新建系统变量&#xff0c;在系统path中配置%MAVEN396_HOME%\bincmd中输入mvn -version查询是否成功配置本地仓库地址 创建一个本地文件夹当做本地仓库&#xff0c;名字可以…

MySQL重装记录

一、win10安装MySQL8 https://jingyan.baidu.com/article/5225f26b548b2ea7fb090846.html 二、win10重装系统后Mysql环境和数据的恢复 1.mysqld --initialize --insecure &#xff08;生成data文件&#xff09; 2.mysqld mysql -install 3.net start mysql &#xff08;启…

应用机器学习的建议 (Advice for Applying Machine Learning)

1.决定下一步做什么 问题&#xff1a; 假如&#xff0c;在你得到你的学习参数以后&#xff0c;如果你要将你的假设函数放到一组 新的房屋样本上进行测试&#xff0c;假如说你发现在预测房价时产生了巨大的误差&#xff0c;现在你的问题是要想改进这个算法&#xff0c;接下来应…

CMS如何调优

业务JVM频繁Full GC如何排查 原则是先止损&#xff0c;再排查。 FGC的原因是对象晋升失败或者并发模式失败&#xff0c;原因都是老年代放不下晋升的对象了。 1.可能是大对象导致的内存泄漏。快速排查方法&#xff1a;观察数据库网络IO是否和FGC时间点吻合&#xff0c;找到对应…

Mysql:5.1升级5.6遇到的问题及解决方式

yum是不可行的.因为yum源没更新,我已经使用了163网易的源,但是还是不行.最新版仍然不是5.6.没办法,mysql分区是5.5之后的功能,要使用分区功能,就必须升级.. 去官网下载地址:MySQL :: Download MySQL Community Server, 下载了全部包. 报 错.file /usr/share/mysql/charsets/RE…

碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测,预测新数据

碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测&#xff0c;预测新数据 目录 碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测&#xff0c;预测新数据预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现LSTM长短期记忆神经网络多输入单输出未来…

推荐收藏!48道数据分析师高频面试题汇总!

大家好&#xff0c;最近很多小伙伴私信我&#xff0c;讲一下数据分析的面试题&#xff0c;今天给大家整理了48道数据分析师面试时被频繁问到的题目&#xff0c;找数据分析岗位的同学一定要码住认真看。 想了解最新的面试动态、最新高频考点、技术交流的同学&#xff0c;可以文…