2011-05-21 129 views
3

我在實用程序類中創建實用程序方法GetServiceTicketNumber(),因爲該方法將經常使用,我不想每次都實例化,因此我製作了方法& _ticket靜態。C#實用功能靜態方法/靜態類/單身模式

UtilityManager也包含其他幾種方法。

我的問題是:

1)這是實現功能的正確方法嗎?

2)是否讓UtilityManager也是一個靜態類/不是?,它有什麼不同?

3)以下代碼(用於TicketProvider功能)是否以單例模式編寫? (考慮到大部分的單例類的實例同一類UtilityManager。)

其它信息:類稱爲Asp.Net應用

public sealed class UtilityManager 
{  
    public static readonly TicketProvider _ticket = new TicketProvider(); 

    public static int GetServiceTicketNumber() 
    {  
     return _ticket.GetTicket(); 
    } 
} 

回答

3

實用方法是最好的聲明爲static和大量的代碼檢查工具,如將StyleCop的實際建議你的效用函數是靜態的,所以你在正確的軌道上。如果你想擁有一個TicketProvider的單例實例,你可以使用一個靜態構造函數來確保該字段在被實際訪問和初始化之前被初始化。你也可以讓這個類是靜態的,以表明這個類不是被設計爲實例化的,而是僅用於實用程序。以下是我的建議:

public static class UtilityManager 
{ 
    static UtilityManager() 
    { 
     Ticket = new TicketProvider(); 
    } 

    public static TicketProvider Ticket { get; private set; } 

    public static int GetServiceTicketNumber() 
    {  
     return Ticket.GetTicket(); 
    } 
} 
+0

感謝您的回覆,有什麼好處在構造函數中提供的初始化比這段代碼「public static readonly TicketProvider _ticket = new TicketProvider();」 – user758405 2011-05-21 22:58:22

+1

靜態字段在首次使用時被初始化。另一方面,靜態構造函數將確保只要類本身以任何形式訪問,字段就會被初始化。所以靜態構造函數將確保您的字段按照您想要的順序一次全部初始化。其實這裏有點個人喜好。 – 2011-05-21 23:02:13

+0

如何決定是否將實用類作爲實例/靜態對待? – user758405 2011-05-21 23:19:19

4

1:聽起來可行;往往這是一個主觀的呼籲;例如,如果您的實用程序依賴於靜態字段,則會限制您爲每個AppDomain設置一個設置。這可能是好的,但如果您後來轉向多租戶,可能會受到限制。這也可能更難以測試。

2:靜態類不能有實例(或實例方法);如果這些方法都是靜態實現的,那麼可能它應該是一個靜態類

3:我看到單身人士比靜態在這裏沒有好處。如果您需要將單例視爲一個實例,單例就很有用,例如實現一個接口。

這裏的另一個選擇可能是常規實例,但只需確保所有代碼與同一個實例對話即可 - 也許可以通過IoC/DI(或許不是)。這會給你同樣方便,但對於測試和多租戶

作爲一個側面說明了更多的靈活性,你可能還需要考慮線程的影響,特別是在Web應用程序(高度線程)。共享數據(包括靜態字段和共享實例)應該正確同步(或不可變)。

+0

「Quest 1的回覆」這個應用程序運行在Web花園設置上,因此每個工作進程(w3wp)都會有一個副本(應該是對我來說不成問題)。 – user758405 2011-05-21 22:55:47

+0

「3:在這裏我看不到singleton優於靜態。如果你需要處理的是一個實例,例如實現一個接口,單例是很有用的。」 ------>如何決定是否將實用類作爲實例/靜態對象。通過上述所有內容,獲得 – user758405 2011-05-21 23:05:03

+0

@ user758405 :) – 2011-05-22 00:14:13