出处不明。(google了大半天,这篇文章的转载倒是挺多的,不过出处一直没找到,还有些没有标明转载,但发布日期比转载的还晚的忽略不计 = =#)文章中,提到了不少我们容易混淆的问题,特别是装载、内存方面。
借此机会,向大家推荐《程序员的自我修养——链接、装载与库》一书(PDF版下载在)!许多东西是看了那本书才知道的,有助于对静态方法和实例化方法的理解。
————————下面是转载的正文————————
方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。
————————————————
我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#)
以下是他们的回答:
海龙说:
公用的方法,而且是一些零散的 一般用静态方法
张伟说:
几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量 。
萧远山说:
静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的
比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。
张新波说:
静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。
向详说:
静态就是类的,实例就是对象的。
静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。
winson_张林说:
最大的区别在于内存。
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。
showlover说:
静态方法与实例方法各有自己的用处...
是定义成静态方法,还是定义成实例方法,还要看具体情况,比如方法本身与类型没有太大的关系,可以定义成静态方法..
用实例方法,当然需要你先创建实例,才能调用实例方法,而静态方法则不需要..
从性能上说,静态方法效率要稍微高一些,但是它会常驻内存...
一些情况下使用静态方法是有好处的,因为对于静态方法无论你有多少个实例,
内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的..