C#静态类为什么使用

本文关键字:为什么 静态类 | 更新日期: 2023-09-27 18:12:54

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

我经常把我的类设置为静态的,但我不确定什么时候使用静态或不使用静态,或者使用或不使用它有什么区别。

有人能解释一下吗?

C#静态类为什么使用

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

如果一个类被声明为静态,那么变量和方法需要被声明为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
}

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

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

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

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

在我看来,静态函数绝对有用的一种情况是,创建.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(一起使用,在该框架中,您希望根据分配给对象方法的某些属性来拦截/向对象注入功能。总体思路是,您需要一个特殊的构造函数,因为从技术上讲,您正在创建具有特殊添加功能的原始实例的副本。