本帖主要是想和大家分享一下我在ASP.NET开发中的一些习惯或者技巧,望大家批评指正。针对我的用法给一些建议或者意见,大家多多交流,共同提高。闲话少叙,步入正题:

 

C#中关键字static的用法我就不多说了,园子里好贴多得是,大家可以找来看看。不过关于实际项目中的应用似乎描述的不多,现在我举一个实际的例子,看看到底有什么好处。

 

相信大家都遇到过这样的场景:在web.config中定义

1 <app key="ItemKey" value="ItemValue"/>

 

然后再程序代码中通过

System.Configuration.ConfigurationManager.AppSetting["ItemKey"];

 

的方式引用,为了维护方便,可能您会定义这么一个公共的类。比如叫SystemConfig.cs

好,代码也许看起来形如这样:

public static class SystemConfig
{

        public static String ItemKey
        {
            get
            {
                var rv = System.Configuration.ConfigurationManager.AppSettings["ItemKey"];
                if (String.IsNullOrEmpty(rv))
                {
                    throw new Exception("Please maintain [ItemKey] in web.config.");
                }
                return rv;
            }
        }
}

 

然后就可以在其他程序模块中通过SystemConfig.ItemKey的方式来引用Web.config的配置了。似乎这样做看起来已经不错了,有没有需要改进的地方呢?

1. 首先,每次System.Configuration.ConfigurationManager.AppSettings["ItemKey"];的执行都会在内存中为"ItemKey"这个字符串分配新的内存空间,引用一句名言:”重复不是好事情"。

所以我做了如下改动,声明一个const String ItemKey = "ItemKey"; 这样程序每次执行引用的都是同一个内存地址下的”ItemKey"了。

代码形如:

public static class SystemConfig
{
        const String key = "ItemKey";
        public static String ItemKey
        {
            get
            {

                var rv = System.Configuration.ConfigurationManager.AppSettings[key];
                if (String.IsNullOrEmpty(rv))
                {
                    throw new Exception("Please maintain [ItemKey] in web.config.");
                }
                return rv;
            }
        }
}

当然,您可以把const String Key = "ItemKey";的定义放在另外一个常量类中去维护。

2. 上面的改动,应该可以提升一些性能的。还有没有更好的办法呢? 我们看,每次调用SystemConfig.ItemKey的时候,程序都会去执行整个get方法体中的逻辑。而针对本案例中的业务场景,我们需要的仅仅是最终计算出的”结果值“。所以我做了如下改动:

public static class SystemConfig
{

        static SystemConfig()
        {
            ItemKey = _ItemKey;
        }

        #region Properties
        public static readonly String ItemKey;
        private static String _ItemKey
        {
            get
            {

                var rv = System.Configuration.ConfigurationManager.AppSettings["ItemKey"];
                if (String.IsNullOrEmpty(rv))
                {
                    throw new Exception("Please maintain [AdminFolderName] in web.config.");
                }
                return rv;
            }
        }
    #endregion
}

1.将SystemConfig类声明为static的,这样防止用户实例化该类,因为类中定义的都是静态属性或者方法,所以没有必要让用户实例化该类。即使实例化该类也做不了任何事情。

2.定义静态构造函数,在构造函数中完成对静态只读变量ItemKey的赋值操作。为了让代码看起来干净,声明了ItemKey的赋值方法,即:私有静态属性_ItemKey。

这样再使用SystemConfig.ItemKey时,拿到的就是计算出的结果值。有效的省去了计算逻辑。 

本方法对很多其他场景也都适用,尤其是那些长期不会变更的,中间逻辑又很繁琐耗时的场景。

希望这种技巧对大家有所帮助。

如果大家对于这样的做法有自己的一些不同看法,请踊跃发言,在下洗耳恭听。

谢谢。

 posted on 2012-11-15 09:35  段子手6哥  阅读(1174)  评论(4编辑  收藏  举报