C静态类为什么使用?

C# static class why use?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to Use Static Classes in C#

我经常将类设置为静态的,但我不确定何时使用静态的或不使用静态的,也不知道使用静态的和不使用静态的有什么区别。

有人能解释一下吗?


使类成为静态的,只是防止人们试图创建它的实例。如果您的类中所有的成员都是静态的,那么最好将类本身设置为静态的。


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

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

使用静态类包含不与特定对象关联的方法。例如,通常需要创建一组方法,这些方法不作用于实例数据,也不与代码中的特定对象相关联。可以使用静态类来保存这些方法。

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

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

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
}


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

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

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

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

在我看来,静态函数绝对有用的一种情况是,创建一个.create()或.new()方法来实现对象创建的逻辑,例如,当您希望代理正在创建的对象时,

1
2
3
4
5
6
7
8
9
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动态代理)一起使用,在该框架中,您希望截获/注入对象中的功能,例如,分配给对象方法的某些属性。总的来说,您需要一个特殊的构造函数,因为从技术上讲,您正在创建一个具有特殊添加功能的原始实例的副本。