C# 靜態類 單例模式 對比


公司的類都需要使用單例模式實現,這個可以節省資源,避免重復對象的生成。但是靜態類也可以做到這一點,而且寫起來更簡潔,於是查閱相關資料,希望弄明白兩者的差別。

1.單例模式可以在用到的時候初始化,而靜態類會在程序開始運行時初始化?

通過自己的實踐,我認為這個說法是不對的。我寫了下面的例子進行實驗。

    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine(Class1.get(190));
            GC.Collect();
            Console.ReadKey();
        }
    }
    public static class Class1
    {
        public static int[] arr = new int[20480000];

        static Class1()
        {
            for (int i = 1; i < arr.Length; i++)
            {
                arr[i] = i;
            }
        }

        public static int get(int i)
        {
            return arr[i];
        }
    }

 

程序進入主函數時,內存是這樣的

顯然靜態類中的arr沒有被初始化,繼續執行

  

可以看到這時靜態類的arr被初始化了,而且arr值全部為0時,內存並沒有變化,難道是微軟做了優化?

2.GOF對單件的第一句場景解釋就是“如果需要唯一實例”?

額,靜態類難道不是唯一實例么?

3.單例模式,解耦?

 

public interface IHelloWorld
{
    string HelloWorld();
}
 
//然后是接口的兩個實現.
public class HelloWorldEnglish : IHelloWorld
{
    string IHelloWorld.HelloWorld()
    {
        return "Hello World !";
    }
}
public class HelloWorldChinese : IHelloWorld
{
    string IHelloWorld.HelloWorld()
    {
        return "您好 世界 !";
    }
}

public class People
{
    private readonly IHelloWorld  peopleHelloWorld;
    public People(IHelloWorld helloWorld)
    {
        this.peopleHelloWorld = CreateSingle()
//這里你可以使用單例模式創建出來HelloWorldEnglish 或 HelloWorldChinese
    }
    public void SayHello()
    {
        Console.WriteLine(this.peopleHelloWorld.HelloWorld());
    }
}

這個代碼我看完了愣是沒明白解耦和單例啥關系,倒是明白了接口解耦挺好的(手動笑哭),下面大俠觀點與我相同,但還是沒有解開我的疑團

 

 4.單例可以有繼承,實現接口,而靜態類不能

這個觀點我比較贊同,如果想使用單例,又想松耦合,就用單例模式吧。

靜態類比較適合工具類。


參考鏈接:

https://bbs.csdn.net/topics/390487790

https://www.cnblogs.com/zhangzt/p/4350556.html

https://bbs.csdn.net/topics/390825682

https://www.xin3721.com/ArticlecSharp/c13696.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM