C#静态变量与静态方法实例研究
2011-04-23 23:18
495 查看
写了一个翻译英汉单词辞典的小程序,发现在调用几千次的时候速度很慢,程序如下:
XDocument dictionary = XDocument.Load(英汉辞典);
分析了一下,原因在于每次调用这个方法时都会去载入黄条处这个英汉辞典,如果执行2000次,就会载入2000次,自然速度慢,有没有什么办法在程序运行时只载入一次呢?想起在尚学堂看过的设计模式中有一个单例工厂模式,使用了静态变量,似乎能够解决,实例验证:
先定义一个类:
class 翻译{
英汉辞典初始化();
英汉辞典初始化();
}
主程序:
结果:
![](http://images.cnblogs.com/cnblogs_com/angestudy/201104/201104232318068874.png)
![](http://images.cnblogs.com/cnblogs_com/angestudy/201104/201104232318076856.png)
分析如下:
无论是使用静态的翻译.英汉辞典内容,还是new 翻译().构造英汉辞典内容,他们都调用了 英汉辞典初始化() ,但是静态变量中的值只会初始化一次,后面每次访问,都是上次处理过的值,所以第一次显示的结果是相同,也就是说one,two的值其实是一个,第二个two访问的其实是第一次one初始化后的值;而使用类的构造函数来初始化变量每次都会重复初始化,自然其结果不同.
再比如(以下内容为转载):
public static string 英汉(string english,翻译结果 一个或多个) { string 英汉辞典 = Settings.Default.辞典所在目录+"haou_dict.xml"; try { if (File.Exists(英汉辞典)) {
XDocument dictionary = XDocument.Load(英汉辞典);
var query = from p in dictionary.Descendants("Name") where p.Value.ToLower() == english.ToLower() select p.Parent.Element("Content"); if (query.FirstOrDefault() == null) { return null; } else//可以翻译 { if (一个或多个==翻译结果.多个) { return query.FirstOrDefault().Value.Trim(); } else if (一个或多个 == 翻译结果.一个) { return 得到第一个汉字词(query.FirstOrDefault().Value); } throw new Exception("参数错误!"); } } else { throw new Exception("词典文件不存在!"); } } catch (Exception) { throw new Exception("词典文件出错!"); } }
分析了一下,原因在于每次调用这个方法时都会去载入黄条处这个英汉辞典,如果执行2000次,就会载入2000次,自然速度慢,有没有什么办法在程序运行时只载入一次呢?想起在尚学堂看过的设计模式中有一个单例工厂模式,使用了静态变量,似乎能够解决,实例验证:
先定义一个类:
class 翻译{
public static XDocument 英汉辞典内容 =
英汉辞典初始化();
public XDocument 构造英汉辞典内容; public 翻译() { 构造英汉辞典内容 =
英汉辞典初始化();
} public static XDocument 英汉辞典初始化() { if (File.Exists(英汉辞典文件)) { return XDocument.Load(英汉辞典文件); } else { throw new Exception("英汉词典文件不存在!"); } }
}
主程序:
var one = 翻译.英汉辞典内容; var two = 翻译.英汉辞典内容; if (one==two) { MessageBox.Show("相同"); } else { MessageBox.Show("不同"); } one = new 翻译().构造英汉辞典内容; two = new 翻译().构造英汉辞典内容; if (one == two) { MessageBox.Show("相同"); } else { MessageBox.Show("不同"); }
结果:
![](http://images.cnblogs.com/cnblogs_com/angestudy/201104/201104232318068874.png)
![](http://images.cnblogs.com/cnblogs_com/angestudy/201104/201104232318076856.png)
分析如下:
无论是使用静态的翻译.英汉辞典内容,还是new 翻译().构造英汉辞典内容,他们都调用了 英汉辞典初始化() ,但是静态变量中的值只会初始化一次,后面每次访问,都是上次处理过的值,所以第一次显示的结果是相同,也就是说one,two的值其实是一个,第二个two访问的其实是第一次one初始化后的值;而使用类的构造函数来初始化变量每次都会重复初始化,自然其结果不同.
再比如(以下内容为转载):
class Program { static void Main(string[] args) {//输出未经定义的静态变量,结果为0;也说明了,在C#中未赋初值的变量系统自动赋为0 Console.WriteLine(sort.i); //静态变量的访问方法(类名.静态变量名),而且还可以在外部操作静态变量呢,可见静态变量并不神秘; sort.i = 5; //输出5 Console.WriteLine(sort.i); //还可以通过构造函数对静态变量初值呢,呵 sort sortTest = new sort(); //输出构造函数中的赋值 3; Console.WriteLine(sort.i); } } class sort { public static int i; public sort() { i = 3; } } 总结:在类内部访问静态变量时,直接用静态变量名即可,不用以(类名.静态变量名),这样的方式访问, 除了有静态变量之外,还有静态类实例,还有静态方法.但用法都是大同小异;
如:public static void myFun(){} //静态方法
private static Random MyRandom=new Random(); //静态类实例 之所以有时声明为私有静态变量,是为了让它只初始化一次.这样节省了内存空间 但又想让它在外部是不可访问的,这样利用私有这个访问限定符就搞定了. 私有静态:安全又节省空间. 例:如果想在每次实例化类的时间生成一组随机数,但产生随机数是要用到一个类的,即Random,这个类不是静态类,它要产生实例,用产生的实例来生成随机数,但如果在每次类实例化时都产生一个Random实例,那内存空间简直是极大的浪费,所以可以用: private static Random MyRandom=new Random(); 这样每次类实例化时,都会用同一个Random实例MyRandom来产生随机数
相关文章推荐
- java 静态方法和实例方法的区别
- 静态方法和实例方法
- obj的静态方法和实例方法
- 静态方法与实例方法的区别
- python实例方法、静态方法、类方法
- python 实例方法,类方法和静态方法
- 静态方法不能直接调用实例方法和变量,但可以间接调用(即在静态方法中创建类的实例,然后调用)
- Java实例方法被覆盖,静态方法被隐藏
- java 静态方法和实例方法的区别
- Java 静态方法和实例方法的区别
- 第十三节 静态方法和成员变量(实例方法)、方法重载
- 静态方法 和 实例方法 的区别
- java,实例初始化块,静态初始化块,clone方法
- 2 Python 类,实例,静态方法
- Python 实例方法,类方法和静态方法
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- spring创建bean的三种方式-通过构造器,通过静态工厂方法,通过实例工厂方法
- 静态方法和实例方法的区别
- 静态方法和实例方法的区别