详解C#中的静态成员

目录

一、引言

二、静态成员

1、共享数据

2、共享全局变量或全局方法 

3、实现单例模式


一、引言

c#中,相比于于非静态成员,静态成员的生存周期是整个程序周期,内存占用大,为什么还要声明?

二、静态成员

在C#中,静态成员的生存周期是整个程序周期,内存占用也比非静态成员大。尽管如此,仍然有许多情况下需要声明静态成员。

首先,静态成员可以在整个程序中共享数据,这意味着它们可以被所有实例和方法访问。这对于需要在多个实例之间共享数据的情况非常有用。

其次,静态成员可以用于创建全局变量或全局方法,这些变量和方法可以在整个程序中使用,而不需要实例化类。这对于一些全局设置或全局操作非常有用。

另外,静态成员也可以用于实现单例模式,确保只有一个实例存在。

1、共享数据

当我们需要在多个实例之间共享数据时,静态成员可以发挥重要作用。一个典型的例子是计数器,我们希望跟踪创建了多少个类的实例。我们可以使用静态成员来实现这一功能。

public class Counter
{
    private static int instanceCount = 0;

    public Counter()
    {
        instanceCount++; // 每次创建实例时,增加计数器
    }

    public static int GetInstanceCount()
    {
        return instanceCount; // 静态方法可以访问静态成员
    }
}

class Program
{
    static void Main(string[] args)
    {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();

        Console.WriteLine("Instance count: " + Counter.GetInstanceCount()); // 输出3,因为创建了3个实例
    }
}

在这个示例中,我们使用静态成员instanceCount来跟踪创建了多少个Counter类的实例。每次创建实例时,我们递增instanceCount的值。然后,我们可以通过静态方法GetInstanceCount来获取实例的数量,而不需要实例化类。这样,我们可以在整个程序中共享这个计数器,而不仅仅是在单个实例中。

2、共享全局变量或全局方法 

当需要在整个程序中共享全局变量或全局方法时,静态成员可以发挥重要作用。一个典型的例子是创建一个全局配置类,其中包含一些全局设置或操作。

public class GlobalConfig
{
    public static string AppName = "MyApp";
    public static void PrintGlobalMessage()
    {
        Console.WriteLine("This is a global message from " + AppName);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Application Name: " + GlobalConfig.AppName); // 输出 "MyApp"
        GlobalConfig.PrintGlobalMessage(); // 输出 "This is a global message from MyApp"
    }
}

在这个示例中,我们创建了一个GlobalConfig类,其中包含一个静态变量AppName和一个静态方法PrintGlobalMessage。这些静态成员可以在整个程序中使用,而不需要实例化GlobalConfig类。在Main方法中,我们可以直接访问GlobalConfig类的静态变量和方法,以获取全局设置或执行全局操作。这样,我们可以在整个程序中共享这些全局变量和方法,而不需要重复实例化类。 

3、实现单例模式

当需要确保只有一个实例存在时,可以使用静态成员来实现单例模式。单例模式是一种设计模式,用于限制类的实例化次数为一个。

public class Singleton
{
    private static Singleton instance; // 静态变量用于存储唯一实例

    private Singleton() // 私有构造函数,防止外部实例化
    {
    }

    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton(); // 如果实例不存在,则创建一个新实例
        }
        return instance; // 返回实例
    }

    public void DoSomething()
    {
        Console.WriteLine("Singleton instance is doing something");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Singleton s1 = Singleton.GetInstance();
        Singleton s2 = Singleton.GetInstance();

        Console.WriteLine(s1 == s2); // 输出 "True",因为s1和s2是同一个实例

        s1.DoSomething(); // 输出 "Singleton instance is doing something"
        s2.DoSomething(); // 输出 "Singleton instance is doing something"
    }
}

在这个示例中,我们创建了一个Singleton类,其中包含一个静态变量instance和一个静态方法GetInstanceGetInstance方法用于获取Singleton类的唯一实例,如果实例不存在,则创建一个新实例。由于instance是静态的,因此它可以在整个程序中共享,并且只有一个实例存在。在Main方法中,我们获取了两次Singleton的实例,并且可以看到它们是同一个实例。这样,我们可以使用静态成员来实现单例模式,确保只有一个实例存在。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值