C#静态类为什么要用?

时间:2011-10-28 18:53:01

标签: c# class static

  

可能重复:
  When to Use Static Classes in C#

我将我的类设置为静态很多,但我不确定何时使用静态或不使用静态或不使用它。

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:30)

使类静态只会阻止人们尝试创建它的实例。如果你的所有类都是静态成员,那么最好让这个类本身是静态的。

答案 1 :(得分:15)

如果一个类被声明为static,那么变量和方法应该被强制声明为static。

可以将类声明为static,表示它只包含静态成员。使用new关键字无法创建静态类的实例。当加载包含类的程序或命名空间时,.NET Framework公共语言运行库(CLR)会自动加载静态类。

使用静态类来包含与特定对象无关的方法。例如,创建一组不对实例数据起作用且与代码中的特定对象无关的方法是一种常见的要求。您可以使用静态类来保存这些方法。

- >静态类的主要特征是:

  • 它们只包含静态成员。
  • 他们无法实例化。
  • 他们是密封的。
  • 它们不能包含实例构造函数或简单构造函数,因为我们知道它们与对象相关联,并在创建对象时对数据进行操作。

示例

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
}

答案 2 :(得分:3)

静态类在某些情况下很有用,但有可能滥用和/或过度使用它们,就像大多数语言功能一样。

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

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

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

在我看来,静态函数绝对有用的一种情况是创建一个.Create()或.New()方法来实现对象创建的逻辑,例如当你想代理正在创建的对象时,< / p>

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)一起使用,您可以在其中根据分配给其方法的某些属性拦截/注入功能到对象中。总体思路是您需要一个特殊的构造函数,因为从技术上讲,您正在创建具有特殊添加功能的原始实例的副本。