C# 静态类为什么使用?

32

可能是重复问题:
何时在C#中使用静态类

我经常将我的类设置为静态的,但我不确定什么情况下应该使用静态类,或者使用它与不使用它有什么区别。

有人能解释一下吗?


2
静态类和方法例如很有用地实现了单例模式和工厂模式... - Yahia
2
@Yahia:静态类使用单例模式?我不这么认为。 - BoltClock
如果您仔细阅读,那么我写了“静态类/方法”,而且我非常确定在实现单例模式时静态方法是有用的... @BoltClock - Yahia
3个回答

34

将一个类设置为静态只是阻止人们尝试创建它的实例。如果你的类中只有静态成员,那么将类本身设置为静态是一个好习惯。


6
如果我们所有成员都是静态的,将类定义为静态是一个好的做法吗?将类本身定义为静态有什么优势? - Mayur Dhingra
2
它将防止人们尝试实例化它。 - Dylan Smith
6
为了达到这个目的,您可以声明一个私有构造函数并将类设为单例模式。据我所知,静态类会一直存在于内存中,增加开销,而普通的单例类则不会。 - Mayur Dhingra
@DylanSmith 为什么防止人们尝试实例化它是一个好的做法,真正的问题是为什么使用静态方法或静态类是好的? - akira
一般来说,出于可测试性的考虑,我会尽量避免使用静态方法。但是如果你有一个只包含静态方法的类,那么该类的消费者不应该实例化它,因为这是没有意义的。将其设置为静态类将使编译器告诉开发人员他们正在做一些不应该做的事情。 - Dylan Smith

20
如果一个类被声明为静态,则变量和方法需要声明为静态。 一个类可以被声明为静态,表示它仅包含静态成员。无法使用new关键字创建静态类的实例。当程序或包含该类的命名空间被加载时,静态类会自动由.NET Framework公共语言运行时(CLR)加载。 使用静态类来包含与特定对象无关的方法。例如,通常需要创建一组不作用于实例数据并且不与代码中的特定对象相关联的方法。您可以使用静态类来保存这些方法。 -> 静态类的主要特点是: - 它们只包含静态成员。 - 它们不能被实例化。 - 它们是sealed的。 - 不能包含Instance Constructors或简单构造函数,因为我们知道它们与对象关联并在创建对象时对数据进行操作。 示例
static class CollegeRegistration
{
  //All static member variables
   static int nCollegeId; //College Id will be same for all the students studying
   static string sCollegeName; //Name will be same
   static string sColegeAddress; //Address of the college will also same

    //Member functions
   public static int GetCollegeId()
   {
     nCollegeId = 100;
     return (nCollegeID);
   }
    //similarly implementation of others also.
} //class end


public class student
{
    int nRollNo;
    string sName;

    public GetRollNo()
    {
       nRollNo += 1;
       return (nRollNo);
    }
    //similarly ....
    public static void Main()
   {
     //Not required.
     //CollegeRegistration objCollReg= new CollegeRegistration();

     //<ClassName>.<MethodName>
     int cid= CollegeRegistration.GetCollegeId();
    string sname= CollegeRegistration.GetCollegeName();


   } //Main end
}

强制性 强制性 强制性 强制性 强制性 强制性 - Alex Gordon
1
我知道这个答案是很久以前的,但是静态类实际上可以有静态构造函数。只是提供信息而已。如果您选择参与,它们用于初始值的实例化。 - dyslexicanaboko

3

静态类在某些情况下很有用,但滥用或过度使用它们可能存在潜在问题,就像大多数语言特性一样。

正如Dylan Smith已经提到的那样,使用静态类最明显的情况是当你有一个只包含静态方法的类时。允许开发人员实例化这样的类没有任何意义。

需要注意的是,过多的静态方法本身可能表明你的设计策略有缺陷。我发现当你创建一个静态函数时,询问自己这个问题很有帮助--它最适合作为a)实例方法还是b)接口扩展方法。这里的思想是对象行为通常与对象状态相关联,这意味着该行为应该属于对象。使用静态函数意味着该行为不应属于任何特定的对象。

在多态和接口驱动的设计中,过度使用静态函数会受到限制--它们不能在派生类中重写,也不能附加到接口上。通常最好通过接口的扩展方法将“辅助”函数绑定到接口上,从而使所有接口实例都可以访问共享的“辅助”功能。

在我的意见中,静态函数绝对有用的一个情况是在创建.Create()或.New()方法以实现对象创建逻辑时,例如当你想代理正在创建的对象时。

public class Foo
{
    public static Foo New(string fooString)
    {
        ProxyGenerator generator = new ProxyGenerator();

        return (Foo)generator.CreateClassProxy
             (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    }

这可以与代理框架(如Castle Dynamic Proxy)一起使用,其中您想要拦截/注入对象的功能,基于其方法分配的某些属性。总体思路是需要一个特殊的构造函数,因为从技术上讲,您正在创建具有特殊添加功能的原始实例的副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接