静态方法和 与 非静态方法之争!
今天写了端连接数据库的公用方法,在写 数据访问基础类时,斟酌了下静态方法和实例方法,其实静态方法和实例方法是一样的,在类型第一次被使用时加载。到底用哪个比较好呢?
效率:两者调用的速度基本上也没有差别。但是静态方法不用创建实例就可调用,比较简单。从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。
安全:如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。
内存:静态方法:常驻内存!相当于静态变量!直到整个系统被销毁。 非静态方法:根据需要分配的原则,需要用时 实例化,用完销毁!所以在并发的情况下,建议使用单件模式比较好!(单件模式 找百度吧!)
( 修正:实例化之后,系统只分配了变量的空间,并没有给方法也分配不同的空间。方法只与类有关,与实例无关不管有多少实例,方法是由一份拷贝。)
到底如何取舍呢?
从实际项目开发说起,这里有开发项目的三种方式:
开发项目中把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 我想不能兼容多种问题情况。而且也有线程安全的问题。
开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
具体的 大家自己根据实际情况取舍吧!