静态方和和实例方法的区别

关于静态方法和实例方法的一些误区。

一、  
【错误】  静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
 
【正确】   事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
 
 
二、
【错误】    静态方法在堆上分配内存,实例方法在堆栈上。
 
【正确】   事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。

三、
【错误】   实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。

【正确】   事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
    有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留问题。
    大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。




静态方法和实例方法的区别

  观点1:
  这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。
  方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用。。。

  从实际项目开发说起,这里有开发项目的三种方式:
  开发项目中把BLL和DAL分开,在BLL调用DAL的代码。
  一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发 )
  class DAL
  {
  public static string GetUserName(...);
  }
  在BLL中调用:
  DAL.GetUserName();
  二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:
  class DAL
  {
  public static readonly DAL dal = new DAL();
  public string GetUserName(...);
  }
  在BLL中调用:
  DAL.dal.GetUserName();
  三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:
  class DAL
  {
  public string GetUserName(...);
  }
  在BLL中调用:
  DAL dal = new DAL();
  dal.GetUserName();
  ---------------------------------------------------------------
  开发方式一:我以为在一些情况下(比如 调用多个数据库、GetUserName(...)内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,所以很普遍。
  开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在,如果出现在B/S 我想不能兼容多种问题情况。而且也有线程安全的问题。
  开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
  特别说明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。
  
  
  观点2:
  最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
  任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
  
  总结:
  大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
  
  补充内容:
  静态成员与非静态成员比较:
  
    ①静态成员属于类所有,非静态成员属于类的实例所有。
    ②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
    非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,
    类的静态成员在内存中只占同一块区域。
    静态方法与非静态方法:
    1、静态方法属于类所有,类实例化前即可使用。
    2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
    3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,
    
    static内部只能出现static变量和其他static方法!而且static方法中还不能使用this.... 等关键字..因为它是属于整个类!
    2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
    3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
posted @ 2014-04-09 17:38  Dream_It_Possible  阅读(244)  评论(0编辑  收藏  举报