C# 創(chuàng)建單例的多種方式
關(guān)于為什么需要?jiǎng)?chuàng)建單例?這里不過(guò)多介紹,具體百度知。
關(guān)于C# 創(chuàng)建單例步驟或條件吧
1、聲明靜態(tài)變量;
2、私有構(gòu)造函數(shù)(無(wú)法實(shí)例化)
3、靜態(tài)創(chuàng)建實(shí)例的方法;至于我這里的Singleton是sealed ,只是為了防止被繼承,其實(shí)有私有構(gòu)造函數(shù)足夠了,這里只是為了代碼可讀性。
第一種常見(jiàn)的方式創(chuàng)建單例:
/// <summary>
/// 不安全的單例
/// </summary>
public sealed class Singleton
{
private static Singleton _Singleton;
private Singleton() { }
public static Singleton GetSingleton()
{
if (_Singleton == null)
{
_Singleton = new Singleton();
}
return _Singleton;
}
}
注:為什么說(shuō)是不安全的單例,多線程訪問(wèn)時(shí)可能會(huì)new多個(gè)對(duì)象...
第二種方式創(chuàng)建單例:
/// <summary>
/// (多線程)安全單例
/// </summary>
public sealed class Singleton
{
private static Singleton _Singleton;
private static readonly object obj = new object();
private Singleton() { }
public static Singleton GetSingleton()
{
if (_Singleton == null)
{
//加鎖保護(hù),在多線程下可以確保實(shí)例值被創(chuàng)建一次。缺點(diǎn)是每 次獲取單例,都要進(jìn)行判斷,涉及到的鎖和解鎖比較耗資源。
lock (obj)
{
if (_Singleton == null)
{
_Singleton = new Singleton();
}
}
}
return _Singleton;
}
}
注:為了解決上面第一種方式創(chuàng)建的不安全實(shí)例問(wèn)題應(yīng)用而生。
第三種方式創(chuàng)建單例:
/// <summary>
/// 只讀單例
/// </summary>
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
}
/// <summary>
/// 基于上面的只讀單例=自動(dòng)屬性只讀單例(語(yǔ)法糖)
/// </summary>
public sealed class Singleton
{
private Singleton() { }
public static Singleton Instance { get; } = new Singleton();
}
注:只讀屬性式=>借助readonly屬性,instance只被初始化一次,同樣達(dá)到了單例的效果。在引用函數(shù)執(zhí)行第一句話之前,instance其實(shí)已經(jīng)被賦值了,并不是預(yù)期的 只有到訪問(wèn)Instance變量時(shí)才創(chuàng)建對(duì)象。
第四種方式創(chuàng)建單例:
/// <summary>
/// Singleton中加上靜態(tài)構(gòu)造函數(shù)。
/// </summary>
public sealed class Singleton
{
public static readonly Singleton instance = new Singleton();
private Singleton()
{
Console.WriteLine("初始化1!");
}
static Singleton()
{
}
public static Singleton Instance
{
get { return instance; }
}
}
注:為了解決(第三種只讀屬性實(shí)例)在執(zhí)行第一句代碼之前,實(shí)例已經(jīng)被初始化問(wèn)題。
第五種方式創(chuàng)建單例:
/// <summary>
/// 使用Lazy創(chuàng)建單例,默認(rèn)是線程安全的
/// </summary>
public sealed class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());//
private Singleton() { }
public static Singleton Instance
{
get
{
return instance.Value;
}
}
}
// 貼一下關(guān)于上面Lazy<T> s=new Lazy<T>()參數(shù)的定義; // 摘要: // 初始化System.Lazy`1類的新實(shí)例。 懶惰初始化時(shí) // 發(fā)生時(shí),使用指定的初始化函數(shù)和初始化模式。 // 參數(shù): // valueFactory: // 被調(diào)用以生成延遲初始化值的委托是必需的參數(shù) // // isThreadSafe: // 如果要使此實(shí)例可由多個(gè)線程同時(shí)使用,則為true; false //使此實(shí)例一次只能由一個(gè)線程使用。 public Lazy(Func<T> valueFactory, bool isThreadSafe);
以上就是C# 創(chuàng)建單例的多種方式的詳細(xì)內(nèi)容,更多關(guān)于c# 創(chuàng)建單例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- c# 單例模式的實(shí)現(xiàn)
- C#實(shí)現(xiàn)單例模式的幾種方法總結(jié)
- c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景
- 解析C#設(shè)計(jì)模式之單例模式
- 關(guān)于c#中單例模式的一些問(wèn)題
- c# 單例模式的實(shí)現(xiàn)方法
- c#設(shè)計(jì)模式之單例模式的實(shí)現(xiàn)方式
- 淺談C#單例模式的實(shí)現(xiàn)和性能對(duì)比
- C#單例模式(Singleton Pattern)詳解
- c#單例模式(Singleton)的6種實(shí)現(xiàn)
- 詳解C# Socket簡(jiǎn)單例子(服務(wù)器與客戶端通信)
- 淺談C#多線程簡(jiǎn)單例子講解
相關(guān)文章
Unity3D實(shí)現(xiàn)相機(jī)跟隨控制
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)相機(jī)跟隨控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07

