静态类与类的实例

时间:2010-09-11 15:38:11

标签: c# design-patterns

我有一个静态类,用于访问我的公共属性(整个应用程序的全局)和我在应用程序运行期间使用的方法。例如,我在静态类中设置了一些属性,在app运行时我可以从属性中获取值。

但是我可以用单例模式创建非静态类并以相同的方式使用它。

问题:在我的案例中哪种方法是正确的?

5 个答案:

答案 0 :(得分:3)

取决于你想要达到的目标。

我会在你的应用程序中使用静态类来提供实用程序功能,并且大多数情况下都避免使用单例。有关何时使用单身人士的信息,请参阅this question

如果你的类代表系统中的某种实体(例如:用户,博客文章,产品,学生等),它不应该是静态类,而是每次逻辑使用时都要实例化单独的实例。

答案 1 :(得分:3)

下面的示例显示您可以使用具有单例类的接口(使用静态类是不可能的。)

我更喜欢这种模式在静态方法/属性的大量列表或几个静态类之上。

这些接口可以提供特定于主题的设置,这些设置甚至可以用作其他方法或类的参数,只要合同得到尊重,这些类就不需要知道设置的来源。

public sealed class Settings : IUserStettings, IOSettings
{
    static readonly Settings instance = new Settings();

    static Settings(){ }

    Settings(){ }

    public static Settings Instance
    {
        get { return instance; }
    }

    //-- interface implementation

    public string UserName
    {
        get { throw new NotImplementedException(); }
    }

    // ---etc...

     public string filename
    {
        get { throw new NotImplementedException(); }
    }

    //-- interface implementation
}


public interface IOSettings
{
    string disk {get;}
    string path { get; }
    string filename { get; }
}

public interface IUserStettings
{
    string UserName { get; }
    string Password { get; }
}

这可以通过以下简单方式使用:

    IOSettings iosettings = Settings.Instance as IOSettings;

    if(iosettings!=null){
        Filereader.ReadData(IOSettings iosettings);
    }

    IUserSettings usersettings = Settings.Instance as IUserSettings;

    if(usersettings!=null){
        UserManager.Login(IUserSettings usersettings);
    }

答案 2 :(得分:1)

我的想法

1-如果没有理由在.net Framework Math Class中有实例,则使用静态类。

Math类是静态的,因为没有充分的理由拥有这个类的对象然后维护该对象。

2- Singleton模式可能与静态类概念混淆,但在单例模式中,您可以获得在内存中创建的整个对象。

所以它最终取决于你的要求。

答案 3 :(得分:1)

从OO /可测试性的角度来看,这两者都不是特别好的解决方案。在SO中搜索singleton以查看参数。也就是说,如果您需要/想要编写像Math

那样的过程代码,请不要使用静态仅用于状态

答案 4 :(得分:0)

我认为人们倾向于在实际需要静态类时使用单例类,但需要确保该类是以某个值启动的。但是如果可以的话,他们真的应该避免。