l8487  
讨论下静态方法 静态方法的区别,以及在什么时候使用  这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。 
方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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#静态函数及变量的一个精典例子与代码 
(1)用于对静态字段、只读字段等的初始化。               
(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。       
(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数 
(4)静态构造函数是不可继承的,而且不能被直接调用。             
(5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。   
(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。  


什么是静态方法 
静态方法的1个特别作用就是不用创建类的对象,而直接用类里面的方法(public static 2个条件), 
例如: class A { public static void b() {..............} } 
可 以这样直接用: A.b(); 那么在程序中如何可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点 时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例, 它的静态字段永远都只有一个副本。 static: 类变量(对象共享)可以用类名,对象名点取,间接使用。 类方法 
1)static方法中不能直接使用非静态成员, 因为非静态成员与实例相关,通过对象点取间接使用 
2)static方法中不能用this(与实例相关) 
3)非static方法中可以使用static成员 
静态方法有什么弊端? 
问:我翻看一些源码工程时看到几乎没有什么静态方法唯独Ms的SQLHelper中几乎全是静态方法 为什么呢? 
答1:在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能我是这么认为的 :) 
答2:本身不可升级, 重写 这要看一个软件产品的目的是什么了. 
答3:为了方便,不用实例化,但这样程序编译运行时就占用了系统资源 
答4: 静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放还有就是, 所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置 的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的 
答5:静态方法/数据成员是属于类的,不是属于某一个对象 的,因而调用它不需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象所共有,因而在需要共享数据时,定义这种类型时很好的选择。 一但定义一个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序启动,就装入内存,没有定义该类时它不会载入内存) 静态成员的作用域与它所属的类的作用域相同
posted on 2009-08-23 08:43  l8487  阅读(387)  评论(0)    收藏  举报