【从零开始入门unity游戏开发之——C#篇20】C#面向对象的封装——静态成员(`static`)(静态字段、静态方法、静态属性、静态构造函数、静态类)

server/2024/12/22 18:22:19/

文章目录

  • 静态成员(`static`)
    • 1、静态成员的特点:
    • 2、为什么可以直接点出来使用?
    • 3、不同的静态成员介绍
      • 3.1. 静态字段
      • 3.2. 静态方法
      • 3.3. 静态属性
      • 3.4. 静态构造函数
      • 3.5. 静态类
    • 4、静态成员的优缺点
      • 优点:
      • 缺点:
    • 5、静态成员的使用场景
    • 6、总结
  • 专栏推荐
  • 完结

静态成员(static

static修饰的成员变量、方法、属性等,称为静态成员。

1、静态成员的特点:

直接用类名点出使用

类名.静态成员名

2、为什么可以直接点出来使用?

程序中是不能无中生有的。我们要使用的对象,变量,函数都是要在内存中分配内存空间的。之所以要实例化对像,目的就是分配内存空间,在程序中产生一个抽象的对象。

静态成员的特点

  • 程序开始运行时就会分配内存空间。所以我们就能直接使用。
  • 静态成员和程序同生共死。只要使用了它,直到程序结束时内存空间才会被释放。
  • 一个静态成员就会有自己唯一的一个内存小房间,这让静态成员就有了唯一性,在任何地方使用都是用的小房间里的内容,改变了它也是改变小房间里的内容。

3、不同的静态成员介绍

3.1. 静态字段

静态字段是类级别的变量,在所有类的实例之间共享。

public class MyClass
{// 静态字段public static int staticField = 0;public void Increment(){staticField++;  // 可以在实例方法中访问静态字段}
}public class Program
{public static void Main(){MyClass.staticField = 10;  // 通过类名访问静态字段Console.WriteLine(MyClass.staticField);  // 输出 10MyClass obj1 = new MyClass();obj1.Increment();  // 静态字段的值会被共享Console.WriteLine(MyClass.staticField);  // 输出 11}
}

3.2. 静态方法

静态方法是属于类的,而不是实例。你可以通过类名调用静态方法。

public class MathHelper
{// 静态方法public static int Add(int a, int b){return a + b;}
}public class Program
{public static void Main(){int result = MathHelper.Add(5, 3);  // 通过类名调用静态方法Console.WriteLine(result);  // 输出 8}
}

3.3. 静态属性

静态属性与静态字段类似,但它们提供了更好的封装,允许你在设置或获取值时添加逻辑。

public class Counter
{private static int count = 0;// 静态属性public static int Count{get { return count; }set { count = value; }}public static void Increment(){count++;}
}public class Program
{public static void Main(){Counter.Count = 5;  // 通过类名设置静态属性Console.WriteLine(Counter.Count);  // 输出 5Counter.Increment();  // 通过静态方法修改静态字段Console.WriteLine(Counter.Count);  // 输出 6}
}

3.4. 静态构造函数

  • 静态构造函数在类的第一次访问时自动调用。只会自动调用一次。
  • 静态构造函数不接受任何参数,并且不能显式调用。
  • 它通常用于初始化静态字段或执行一次性初始化任务。
  • 不能使用访问修饰符
public class MyClass
{// 静态字段public static int staticField;// 静态构造函数static MyClass(){staticField = 10;  // 初始化静态字段Console.WriteLine("静态构造函数被调用");}
}public class Program
{public static void Main(){// 静态构造函数会在第一次访问类的静态成员时被调用Console.WriteLine(MyClass.staticField);  // 输出 10,且输出 "静态构造函数被调用"}
}

3.5. 静态类

静态类是一种特殊类型的类,所有成员都必须是静态的。静态类不能实例化,也不能包含实例成员。
比如我们一直用的Console就是一个静态类.

public static class Utility
{public static void PrintMessage(string message){Console.WriteLine(message);}
}public class Program
{public static void Main(){Utility.PrintMessage("Hello, World!");  // 通过静态类调用静态方法}
}

4、静态成员的优缺点

优点:

  • 节省内存:由于静态成员是所有实例共享的,它们只会占用一次内存。
  • 全局访问:静态成员可以在整个程序中被访问,适合做全局变量或工具函数。

缺点:

  • 线程安全问题:静态成员是共享的,因此如果多个线程同时访问静态成员,可能会引发线程安全问题。需要小心同步。
  • 无法实例化:静态类不能创建实例,因此无法进行继承或实现接口。

5、静态成员的使用场景

  • 单例模式:静态成员通常用来实现单例模式,确保一个类只有一个实例。
  • 全局常量或配置:静态字段或属性可以用来存储全局常量或配置数据。
  • 工具类:静态方法非常适合用作工具类,提供通用的功能,如数学运算、字符串处理等。

6、总结

  • 静态成员属于类本身,而不是类的实例。
  • 静态字段静态属性在所有实例之间共享。
  • 静态方法静态构造函数用于类级别的操作。
  • 静态成员常用于工具类、全局配置、单例模式等场景。
  • 特点:直接用类名点出来使用(全局性)
  • 生命周期:和程序同生共死。程序运行后就会一直存在内存中,直到程序结束后才会释放,因此静态成员具有唯一性
  • 注意:
    • 静态函数中不能直接使用非静态成员
    • 非静态函数中可以直接使用静态成员

专栏推荐

地址
【从零开始入门unity游戏开发之——C#篇】
【从零开始入门unity游戏开发之——unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.ppmy.cn/server/152290.html

相关文章

CTFshow-文件上传(Web151-170)

CTFshow-文件上传(Web151-170) 参考了CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客 Web151 要求png,然后上传带有一句话木马的a.png,burp抓包后改后缀为a.php,然后蚁剑连接,找fl…

C++面向对象三大特性之——继承

C面向对象三大特性之——继承 一.继承的概念及定义1.1概念1.2 继承的定义1.3继承基类成员访问方式的变化 二.基类和派生类对象赋值转换三.继承中的作用域四. 派生类的默认成员函数4.1.派生类构造函数4.2派生类拷贝构造函数4.3派生类的赋值重载函数(operator&#xf…

使用ElasticSearch实现全文检索

文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件,并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…

音视频入门基础:MPEG2-TS专题(19)——FFmpeg源码中,解析TS流中的PES流的实现

一、引言 FFmpeg源码在解析完PMT表后,会得到该节目包含的视频和音频信息,从而找到音视频流。TS流的音视频流包含在PES流中。FFmpeg源码通过调用函数指针tss->u.pes_filter.pes_cb指向的回调函数解析PES流的PES packet: /* handle one TS…

Kafka部署

部署命令 wget https://archive.apache.org/dist/kafka/2.6.0/kafka_2.13-2.6.0.tgz tar -xzvf kafka_2.13-2.6.0.tgz mv kafka_2.13-2.6.0 kafka useradd kafka yum install java mkdir /home/kafka/logs vi /home/kafka/kafka/config/server.properties /home/kafka/kafka…

java-5图片验证码

1 图片验证码意义 验证码可以防止恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试。由于验证码技术具有随机性随机性较强、简单的特点,能够在一定程度上阻碍网络上恶意行为的访问&#xf…

C++ 面向对象编程:友元、

友元:让一个类或函数,能够访问另一个类的私有成员。友元关键字为friend。 友元有三种:第一种是全局函数作为友元,第二种是类作为友元,第三种是成员函数作为友元 第一种是全局函数作为友元,见以下代码&…

高并发架构设计:从 Java Callable 到 CompletableFuture 的进阶修炼

前言 在现代的分布式系统中,高并发性能是一个决定系统能否成功的关键因素。而 Java 作为主流的后端开发语言,也提供了许多强大的工具来帮助我们处理并发任务。今天,我们将通过两个关键工具来讲解高并发架构设计的技巧:Callable 和…