了解 C# 中的静态变量和非静态变量

一.理解静态变量

每当变量具有静态关键字或在静态块内声明时,该变量被视为静态的。

这是一个例子。

复制代码
namespace BasicCsharp
{
    class className
    {
        int numb = 1;  // 非静态变量
        static int num2 = 2;  // 静态变量

        public static void Main(string[] args)
        {
            int a = 1;  // 默认是静态变量
        }

        public void randomMethod()
        {
            int b = 2;  // 默认是非静态变量
        }
    }
}

当您希望变量在创建的所有实例中具有相同的值时,您可以使该变量为静态。

二.静态变量与非静态变量

静态变量在类开始执行时初始化,而非静态变量在对象创建后初始化。

非静态变量会根据对象创建的次数被初始化 n 次,但静态变量在生命周期内只会初始化一次。

您可以在类外调用类的静态变量,但对于非静态变量,您需要实例来调用该变量。

复制代码
namespace BasicCsharp
{
    class className
    {
        int nonStatic;  // 非静态变量
        static int yesStatic = 200;  // 静态变量

        // 构造函数
        public className(int nonStatic)
        {
            this.nonStatic = nonStatic;
        }

        // 主方法
        static void Main(string[] args)
        {
            // 实例化 className 之前
            Console.WriteLine($"static value of yesStatic {className.yesStatic}");

            // 在同一类中,可以直接访问静态变量,不需要类名前缀
            Console.WriteLine($"static value of yesStatic within sameclass {yesStatic}");

            // 实例化非静态变量
            className obj1 = new className(100);
            Console.WriteLine($"non static value of nonStatic {obj1.nonStatic}");
        }
    }
}

此示例显示了如何调用静态变量以及如何调用非静态变量。

这段代码的结果是

yesstatic 的静态值 200

类内 yesStatic 的静态值 200

nonStatic 的非静态值 100

三.静态和非静态的范围

对于静态变量,范围是应用程序范围,这意味着它是在类执行开始时创建的,并且与应用程序持续的时间一样长。

非静态变量在对象创建时创建,在对象删除时也被删除。

另外,当您想在静态方法中使用非静态变量时,您需要先实例化才能使用非静态变量,如果没有实例,您就不能在静态方法中使用非静态变量

四.静态和非静态构造函数

如果我们创建一个静态构造函数,我们需要在任何其他构造函数之前调用它,并且一个类中只能有一个静态构造函数。此外,静态构造函数在应用程序的生命周期中只被调用一次

同时,每个创建的对象都会被调用非静态构造函数。

复制代码
namespace BasicCsharp
{
    class className
    {
        // 静态构造函数
        static className()
        {
            Console.WriteLine("Static constructor is being called");
        }

        // 非静态构造函数
        public className()
        {
            Console.WriteLine("Non-static constructor is being called");
        }

        // 主方法
        static void Main(string[] args)
        {
            // 创建两个类的实例
            className obj1 = new className();
            className obj2 = new className();
        }
    }
}

这段代码的结果是

正在调用静态构造

函数 正在调用非静态构造函数

正在调用非静态构造函数

如上所示,静态构造函数仅被调用一次,而非静态构造函数在创建两个对象时被调用两次。

四.类上的静态

带有静态修饰符的类只能具有静态变量和方法。并且您不能使用静态类创建对象,我们可以使用类名访问静态类中的内容。

复制代码
namespace BasicCsharp
{
    // 数学类
    public static class math
    {
        // 加法方法
        public static int add(int a, int b) { return a + b; }

        // 减法方法
        public static int subtract(int a, int b) { return a - b; }

        // 乘法方法
        public static float multiply(float a, float b) { return a * b; }

        // 除法方法
        public static double divide(double a, double b) { return a / b; }
    }

    // 类名类
    class className
    {
        static void Main(string[] args)
        {
            // 调用数学类中的方法进行计算
            int addition = math.add(3, 3);
            int subtraction = math.subtract(3, 3);
            float multiplication = math.multiply(3, 3);
            double division = math.divide(3, 3);

            // 输出结果
            Console.WriteLine($"addition = {addition}, subtraction = {subtraction}, multiplication = {multiplication}, division = {division}");
        }
    }
}

这是一个静态类的例子,如您所见,它不需要实例化即可使用。它可以通过静态类来使用类中的方法。

结果是

加法 = 6,减法 = 0,乘法 = 9,除法 = 1

相关推荐
Json____31 分钟前
使用python的 FastApi框架开发图书管理系统-前后端分离项目分享
开发语言·python·fastapi·图书管理系统·图书·项目练习
人生在勤,不索何获-白大侠1 小时前
day16——Java集合进阶(Collection、List、Set)
java·开发语言
LIN-JUN-WEI1 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
望获linux2 小时前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件
留不住丨晚霞2 小时前
说说SpringBoot常用的注解?
java·开发语言
hardStudy_h3 小时前
C++——内联函数与Lambda表达式
开发语言·jvm·c++
艾莉丝努力练剑3 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
witton5 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
枯萎穿心攻击5 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau5 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang