【问题标题】:C# Utility functionality Static Method / Static Class / Singleton patternC# 实用程序功能静态方法/静态类/单例模式
【发布时间】:2011-08-30 09:40:45
【问题描述】:

我正在一个实用程序类中创建一个实用程序方法GetServiceTicketNumber(),因为该方法会经常使用,我不想每次都实例化,所以我将 method & _ticket 设为静态.

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();
    }
}

【问题讨论】:

    标签: c# singleton static-methods


    【解决方案1】:

    实用程序方法最好声明为静态,许多代码检查工具(如 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();
        }
    }
    

    【讨论】:

    • 感谢回复,在构造函数中初始化比这段代码“public static readonly TicketProvider _ticket = new TicketProvider();”有什么好处
    • 静态字段在第一次使用时被初始化。另一方面,静态构造函数将确保在以任何形式访问类本身时立即初始化字段。因此,静态构造函数将确保您的字段一次全部初始化,并按照您想要的顺序进行。其实这里有点个人喜好。
    • 如何决定是否将实用程序类视为实例/静态?
    • 如果你打算只用实用函数来填充这个类,请将它设为静态,这样它的用户就不会试图意外地实例化它。另一方面,如果您要使用此类存储特定于实例的数据,请将其声明为实例类,但您仍然可以拥有静态成员(即像 System.String 类)。
    • 注意上面的安全部分取决于TicketProvider是否是线程安全的
    【解决方案2】:

    1:听起来可行;通常是主观的呼唤;例如,如果您的实用程序依赖于静态字段,这会将您限制为每个 AppDomain 的单个设置。这可能很好,但如果您以后转向多租户,可能会受到限制。它也可能更难测试。

    2:一个静态类不能有实例(或实例方法);如果方法都实现为静态,那么它可能应该是一个静态类

    3:我认为单例与静态相比没有任何好处。如果您需要将 is 视为实例,例如实现接口,则单例很有用。

    这里的另一个选择可能是常规实例,但只需确保您的所有代码都与同一个实例对话 - 可能通过 IoC/DI(也可能不是)。这将为您提供类似的便利,但更灵活地进行测试和多租户

    附带说明,您可能还需要考虑线程的含义,尤其是在网络应用程序中(高度线程化)。共享数据(包括静态字段和共享实例)应正确同步(或不可变)。

    【讨论】:

    • "Reply for Quest 1" 这个应用程序在网络花园设置上运行,所以每个工作进程(w3wp)都会有一份它的副本(这对我来说应该不是问题)。
    • "3:我在这里看到单例与​​静态相比没有任何好处。如果您需要将 is 视为实例,例如实现接口,则单例很有用。" ------> 如何决定是否将实用程序类视为实例/静态。
    • @user758405 以上所有 :)
    猜你喜欢
    • 2011-03-02
    • 2012-09-25
    • 2012-11-12
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2011-03-26
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多