有个公共类tool的方法f()
public class tool
{
   public (static) void f()
  {
   ....//含数据库操作代码
   }
}
f()中有数据库操作的代码,但f()只是个工具方法,不与tool类其他变量或方法发生关系。程序中有其他很多类都要调用f(),包括不同线程的类,而且调用非常频繁。请问其他类在调用的时候每次实例一个tool然后调用tool实例的f()方法好呢?还是将f方法写成静态方法,其他类直接用tool.f()来调用好?请从性能、效率等各方面分析,欢迎高手们参与讨论

解决方案 »

  1.   

    //每次实例一个tool然后调用tool实例的f()方法
    画蛇添足,你说好不好呢?
      

  2.   

    借花献佛
    [转自 ivony's blog]关于静态方法和实例方法的一些误区。 一、    静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
     
        事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
     
     
    二、    静态方法在堆上分配内存,实例方法在堆栈上。
     
        事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
     
     
    三、    实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。
        事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
        有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留问题。
        大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。
      

  3.   

    viena(维也纳nn木人 [IQ=50,EQ<0]) 顶!!
      

  4.   

    谢谢大家的讨论,但好像意见不是很一致。
    下面2个观点,请大家确认一下是否正确。
    1、假如一个静态方法运行完毕需要很长的时间,当他被某个线程调用并处于运行中时,另一个线程也能调用这个静态方法并运行。除了有资源竞争的代码。
    2、假如将tool类的一个实例放在静态变量中,各个类去调用静态实例的f方法,这与各个类直接调用静态方法f效率是相同的。只是前者更占用内存。
      

  5.   

    谢谢大家的讨论,但好像意见不是很一致。
    下面2个观点,请大家确认一下是否正确。
    1、假如一个静态方法运行完毕需要很长的时间,当他被某个线程调用并处于运行中时,另一个线程也能调用这个静态方法并运行。除了有资源竞争的代码。
    2、假如将tool类的一个实例放在静态变量中,各个类去调用静态实例的f方法,这与各个类直接调用静态方法f效率是相同的。只是前者更占用内存。
      

  6.   

    TO:谢谢大家的讨论,但好像意见不是很一致。
    下面2个观点,请大家确认一下是否正确。
    1、假如一个静态方法运行完毕需要很长的时间,当他被某个线程调用并处于运行中时,另一个线程也能调用这个静态方法并运行。除了有资源竞争的代码。
    2、假如将tool类的一个实例放在静态变量中,各个类去调用静态实例的f方法,这与各个类直接调用静态方法f效率是相同的。只是前者更占用内存。
    S:1:我认为当你在WF里面的静态方法执行时候,多个线程通常不会因为使用同样的静态方法而发生死锁,内部应该有一个线程继续原来的工作,当另外一个线程访问时会另外拷贝公共资源。解决办法可以采用定义公共静态的虚类。
    2:静态的方法在使用量比较少的时候会消耗多点资源,但对于调用频繁,用静态比较好,因为实例化一个对象会初始化他的所有已经的可以获得的值。比喻内库中的一些常用方法都是采用静态的居多。
    2: