zoukankan      html  css  js  c++  java
  • C#静态变量与静态方法实例研究

    写了一个翻译英汉单词辞典的小程序,发现在调用几千次的时候速度很慢,程序如下:

    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("不同");
                }
    

    结果:

    image

    image

    分析如下:

    无论是使用静态的翻译.英汉辞典内容,还是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来产生随机数
    
  • 相关阅读:
    Spring自动代理机制
    JUnit4 详解
    struts2 OGNL
    loj4j的配置跟使用
    junit浅学笔记二
    shell变量设置
    zookeeper使用
    [zz]Linux kernel map
    glog 使用中存在的问题
    shell中特殊字符(串)
  • 原文地址:https://www.cnblogs.com/angestudy/p/2025953.html
Copyright © 2011-2022 走看看