实例方法比静态方法多传递一个隐含的指针参数,该指针指向该方法所从属的已被实例化的对象。这一区别的外在表现为实例方法内可使用this关键字代表所从属的实例对象,而静态方法不可使用this因为静态方法不针对任何实例对象。实例对象调用静态方法会因参数中多出一个指向自己的指针(this)而发生错误。 定义静态方法只需加注static关键字即可。静态方法独立于对象实例之外,与对象是否已被实例化无关,调用静态方法要用类定义的名称而不能用实例名称如: class a { ... public static void b(){}//静态方法 public void d(){}//实例方法 } a c = new a(); a.b();//正确的调用方式,与对象实例无关。 a.d();//错误的调用方式。 c.b();//错误的调用方式。 c.d();//正确的调用方式,隐含this指针,不需要也不允许显式传入对象指针。
还有一个疑问:
静态与非静态的存在之区别在调用方法的不同吗?在编程的时候有没有各自存在的优势呢?例如有的时候用非静态方法较好。
 

解决方案 »

  1.   

    调用静态方法,通过ClassName.Function();
    调用非静态类方法,需要有该类的实例对象,通过ClassInstance.Function();
    静态方法一般跟实例对象无关,如果需要在方法内用到实例对象,可以将实例对象按参数传递.
    属于对象本身的行为,我们一般抽象成非静态的方法,表示对象可以执行某个操作.
      

  2.   

    如果需要给一个DllImport的函数传一个回调函数时(委托实现),必须用static,当然你传一个普通方法也可以,不会报错,但GC在特定的时间,可能会析构掉这个普通方法所实现的类,导致发生问题,用static不会出现这种问题.不信你可以试试,在把一个委托包装好的非静态方法传入一个非托管DLL,然后调用一下GC.Collect.这种必须,也许是static必须存在的一个理由还有,你可以跟踪一下静态构造函数,如果该类静态方法不被调用,也未创建任何该类的实例,该类的静态构造函数不被调用,所以静态方法,比用一个非静态全局类(系统启动时就被创建,能被访问到即可),要节省资源.