2011-05-21 96 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