我新建了一个类Test,类里有方法
public static void A()
{}

public void B()
{}我在调用的时候,如果调用第一个方法时,直接用Text.A();就可以
如果我调用第二个类时要Test t=new Test() ;t.B();
那么请问,第一种调用方法与第二种调用方法有什么区别?
我知道一个实例化,一个没有,他们两个的各自好处有什么呢?
在什么时候用static 什么时候不用呢

解决方案 »

  1.   

    c#语法要求你明确使用static和非static方法,不能装糊涂。因此在B中调用A必须写:
      Test.A(...);
    来调用,而不能写;
      this.A(...);在VB.Net中可以使用那种含糊的方法,当你不小心使用错误的逻辑方法的时候,并不能立刻发现。
      

  2.   

    Q: 在什么时候用static 什么时候不用呢
    ——————————————————————————————————————————
    A: 正由于c#比较严格,因此你可以放心地使用static,即使误用也是一个非常明显的。当你使用static方法的时候,编译器会检查你涉及的所有外部变量都是static的,这引起连锁反应,你必须当所有变量都可以在所有同类对象之间共享、可相互影响、而不是独立的时候才使用static。修改编译器参数可以让你像VB.Net那样(Shared)使用变量,不过一般来说完全不应该这样做。
      

  3.   

    从机制上说,任何对象被实例化之前,其类型对象首先被实例化。对于Test来说,在你第一次使用Test类型的时候,.net执行环境首先将Test对象实例化,然后从Test对象创建t对象并且创建t对象的私有数据空间。其中的static变量是仅仅存在Test中的,只有生存期局限在t内的变量才在t内。也许程序运行中需要动态产生1万个Test的实例,但是Test仅仅在内存中只有一个。而static方法要求内部必须使用static变量,显然“节省”不少资源。不过逻辑上的考虑要比节省资源重要,节省资源是否正确,要看当程序员使用static造成干扰别人的逻辑的时候(甚至你在单线程的时候要假设会不经意地多线程情况下),你们是否可以为给用户造成的业务损失掏钱买单。