Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#静态类为什么使用?_C#_Class_Static - Fatal编程技术网

C#静态类为什么使用?

C#静态类为什么使用?,c#,class,static,C#,Class,Static,可能重复: 我经常将我的类设置为静态,但我不确定何时使用静态或不使用静态,或者使用与否有什么区别 有人能解释一下吗?将类设置为静态只会阻止人们尝试创建它的实例。如果类的所有成员都是静态成员,那么最好将类本身声明为静态。如果类声明为静态,那么变量和方法需要声明为静态 类可以声明为静态的,表示它只包含静态成员。不能使用new关键字创建静态类的实例。加载包含静态类的程序或命名空间时,.NET Framework公共语言运行库(CLR)会自动加载静态类 使用静态类包含与特定对象不关联的方法。例如,创建

可能重复:

我经常将我的类设置为静态,但我不确定何时使用静态或不使用静态,或者使用与否有什么区别


有人能解释一下吗?

将类设置为静态只会阻止人们尝试创建它的实例。如果类的所有成员都是静态成员,那么最好将类本身声明为静态。

如果类声明为静态,那么变量和方法需要声明为静态

类可以声明为静态的,表示它只包含静态成员。不能使用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
}
静态类学院注册
{
//所有静态成员变量
static int nCollegeId;//所有学习的学生的学院Id都是相同的
静态字符串sCollegeName;//名称将相同
静态字符串sColegeAddress;//学院地址也将相同
//成员函数
公共静态int GetCollegeId()
{
nCollegeId=100;
返回(非学院级);
}
//同样地,其他方面的实施也不例外。
}//类结束
公立班学生
{
内特诺尔诺;
弦圈套;
公共GetRollNo()
{
nRollNo+=1;
返回(nRollNo);
}
//同样地。。。。
公共静态void Main()
{
//不需要。
//CollegeRegistration objCollReg=新的CollegeRegistration();
//.
int-cid=CollegerRegistration.GetCollegeId();
字符串sname=CollegeRegistration.GetCollegeName();
}//主端
}

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

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

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

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

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

例如,静态类/方法对于实现单例模式和工厂模式非常有用…@Yahia:Singleton模式与静态类@BoltClock如果你仔细阅读的话,我写了“静态类/方法”,我非常确定静态方法在实现单例模式时是有用的…强制强制强制强制强制强制我知道这个答案是很久以前的,但是静态类实际上可以有静态构造函数。仅供参考。如果您选择参与,它们将用于初始值实例化。如果所有成员都是静态的,为什么将类设置为静态是一种好的做法?将类本身设置为静态的好处是什么?它将阻止人们尝试实例化它,但是出于这个目的,您可以声明一个私有构造函数并将类设置为单例。据我所知,静态类将始终保留在内存中,从而产生开销,但普通的单例类不会。@DylanSmith为什么阻止人们尝试实例化它是一种好的做法,真正的问题是为什么使用静态方法或静态类是好的???一般来说,出于测试能力的目的,我尽量避免使用静态方法。但是,如果您有一个只包含静态方法的类,那么该类的使用者不应该实例化它,因为它毫无意义。使它成为一个静态类将允许编译器告诉开发人员他们正在做一些不应该做的事情。