突然想知道静态函数的来历,在网上找了一下,大家都说静态函数不用实例化,但是我想知道难道静态函数存在的目的就是节省new那句话吗?只是为了不去实例化吗?

解决方案 »

  1.   

    有些时候静态的比较容易实现,容易理解,不用创建对象,也节约了内存和时间,比如
    MessageBox.Show
    如果你设计成非静态的,你操作方式就是:
    MessageBox mb = new MessageBox("提示信息");
    mb.Title = "标题栏";
    mb.Icon = ...
    if(mb.ShowDialog() == DialogResult.OK)
    {
    }这样一个是用的烦杂,一个是每次要new一个对象。
      

  2.   

    c# 里的静态函数也是需要内存空间的,只是在类里面的内存中,而不是对象的内存中。如果你调用一个静态函数ClassA.MyStaticMethd();1.创建类(调用静态构造函数 Static ClassA(){ } 这个我们一般都不写,编辑器会自动加上,如果写了也不会有错,编辑器就不会加了,和一般的构造函数一样 ) 包括了一些静态方法,静态字段。
      

  3.   

    你不觉得在非OO语言里(比如C)全局函数还是挺有用的么?在OO语言里,就是静态函数了
      

  4.   

    静态构造函数: 
    (1)用于对静态字段、只读字段等的初始化。               
    (2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。         
    (3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数 
    (4)静态构造函数是不可继承的,而且不能被直接调用。             
    (5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。     
    (6)任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。   
    (7)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。 
      

  5.   

    静态的,在程序加载到内存时,就跟它分配的相应的空间,地址是唯一的。(在同一进程内)。成员的话,只有new后才分配地址
      

  6.   


    你觉得在 new 一个对象的时候,还需要创建这个对象的函数部分吗。要是还需要在内存中创建这个对象的函数部分,岂不是每 new 一次都会浪费一堆内存空间来装一堆一模一样,且绝对不会改变,还一定可以裁减的东西。有见过那么蠢的做法么。
      

  7.   


    这个说的是没错的。函数都是静态的,不同的是,成员方法,提供了一个默认的参数:this。就这点区别。但是因为你需要this,那你就需要分配内存,构造,执行多余代码,如果反复操作。这个内存,cpu的消耗就不能忽略。
      

  8.   

    网上收一下很多,推荐到www.qupan.com
      

  9.   


    如果这个 this 是编译器在编译的时候加的呢?还需要这些开销么。
      

  10.   

    非static和static函数本质无差别
      

  11.   

    this就是你自己。显然你需要构造了才有自己,就是我1楼的例子。你静态的,这些之分配一次,如果是成员方法,则需要先用户创建一个对象,当你调用对象的成员方法时候,编译器找到方法,吧对象,作为变量传递给方法。这就是静态方法和成员方法唯一的区别。
    显然你是明白这一点的,c++下的概念,c#下应该也一样。都是有代码段的。
      

  12.   


    一时手快提交早了如果这个 this 是编译器在编译的时候加的呢?还需要这些开销么。this 是个指针来的,所以不需要新增内存,也不需要构造。至于多余的代码例如需要输出 control.Name。若要用静态方法实现,还是先要把 control 做为参数传入。跟成员函数没有区别。只是那种写法比较贴近现实而已。
      

  13.   


    呃老实说,我没有考虑过这个问题。如果要写一个成员函数,它里面居然没有用到任何与 this 想关的东西,不如直接写成静态的。
    如果需要任何与 this 相关的东西,写成静态的话,需要显示传入 this;若写成成员函数,则隐式传入 this。我个人觉得没有任何区别啦。
      

  14.   


    就是这个意思,成员方法,会隐式传递this。是的。完全正确。
      

  15.   

    非静态成员函数无时无刻都有着 对自己引用的this
    而静态成员函数无时无刻都没有A a;a.InstanceMethod(123); //非静态
    A.StaticMethod(a,123);   //静态