C# 中的Singleton模式

一般写Singleton基本都是一下这个套路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Singleton
{
    public static Singleton  instance;
 
    private Singleton()
    {
     
    }
 
    public static Singleton Getinstance()
    {
        if(instatnce == null)
        {
            instance = new Singleton();
        }
 
        return instance;
    }
}

但是今天学到一个C#独有的Singleton写法:

1
2
3
4
5
6
7
8
9
class sealed Singleton
{
    public static readonly Singleton  instance = new Singleton();
 
    private Singleton()
    {
 
    }
}

这种写法简单实用,大大减少了代码量。

但是缺点就是无法被继承,并且启动时就被初始化,无法延迟初始化。

 

我以这种写法,写了一个简单的LoadBalance类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public sealed class LoadBalancer
{
    public static readonly LoadBalancer balancer = new LoadBalancer();
    private ArrayList servers = new ArrayList();
    private Random random = new Random();
 
    protected LoadBalancer()
    {
        servers.Add("SERVER I");
        servers.Add("SERVER II");
        servers.Add("SERVER III");
        servers.Add("SERVER IV");
        servers.Add("SERVER V");
    }
 
    public string Server
    {
        get
        {
            int i = random.Next(servers.Count);
            return servers[i].ToString();
        }
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        LoadBalancer b1 = LoadBalancer.balancer;
        LoadBalancer b2 = LoadBalancer.balancer;
        LoadBalancer b3 = LoadBalancer.balancer;
        LoadBalancer b4 = LoadBalancer.balancer;
 
        if (b1 == b2 || b2 == b3 || b3 == b4)
            Console.WriteLine("Same instance");
        Console.WriteLine(b1.Server);
        Console.WriteLine(b2.Server);
        Console.WriteLine(b3.Server);
        Console.WriteLine(b4.Server);
 
        Console.ReadLine();
    }
}

调用的结果是:

 

Same instance

SERVER III

SERVER I

SERVER IV

SERVER IV

 

posted @   のんきネコ  阅读(675)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示