首页 新闻 会员 周边

c# 静态实例的疑惑

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-12 13:53
 public class MonDac
{

 private static MonDac _instance;

 public static MonDac Instance
        {
            get
            {
                _instance = new MonDac();
                return _instance;
            }
        }
         public void UpdateMethod(int ID)
        {
    
          ...
        }    

}
MonDac.Instance.UpdateMethod(1);

        

public class MonDac
{

         public static void UpdateMethod(int ID)
        {
    
          ...
        }    

}
MonDac.UpdateMethod(1);
有高人能指教这两种写法的区别和效率的不同之处吗?
C#
achievie的主页 achievie | 初学一级 | 园豆:6
提问于:2013-08-12 10:26
< >
分享
最佳答案
0

效率上第2种高一些,第1种需要创建MonDac的实例,第2种不需要。

收获园豆:8
dudu | 高人七级 |园豆:31007 | 2013-08-12 11:14

如果每次调用都会创建一个新的实例,是不是内存会一直增长呢?

achievie | 园豆:6 (初学一级) | 2013-08-12 11:34

@董先生: 

第1种方式是单例,并不存在“每次调用都会创建一个新的实例”

如果不用单例,虽然“每次调用都会创建一个新的实例”,也会不造成内存一直增长,因为有GC

dudu | 园豆:31007 (高人七级) | 2013-08-12 11:38
其他回答(2)
0

我这么理解的,按照你第一种写法,其实调用多少次updateMethod方法就创建了多少个静态的_instance,而且静态变量不会自己销毁,所以这个方式非常浪费空间。第二种方式定义静态方法是一种效率高的方式。第一种其实可以改进下,get方法里面做下判断if(_instance!=null){...}

加百力 | 园豆:533 (小虾三级) | 2013-08-12 11:13
0

应该这样,就不会创建多个实例了。

   private class MonDac
    {
        private static object syncObj = new object();
        private static MonDac _instance;

        public static MonDac Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (syncObj)
                    {
                        if (_instance == null)
                        {
                            _instance = new MonDac();
                        }
                    }
                }
                return _instance;
            }
        }
    }

另外第二个是在你应用程序启动的时候就创建好,一个增加少量的启动初始化时间,一个如果你的应用程序从头到尾没有使用过MonDac,那么你创建一个静态实例就属于资源浪费了。

所以:其实我觉得第一个方案还比较好些,实际上也只创建一个实例(按我的修改后),并且满足在使用的时候才创建实例并且只创建一个。

收获园豆:2
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-08-12 11:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册