本帖主要是想和大家分享一下我在ASP.NET开发中的一些习惯或者技巧,望大家批评指正。针对我的用法给一些建议或者意见,大家多多交流,共同提高。闲话少叙,步入正题:
C#中关键字static的用法我就不多说了,园子里好贴多得是,大家可以找来看看。不过关于实际项目中的应用似乎描述的不多,现在我举一个实际的例子,看看到底有什么好处。
相信大家都遇到过这样的场景:在web.config中定义
1
然后再程序代码中通过
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时,拿到的就是计算出的结果值。有效的省去了计算逻辑。
本方法对很多其他场景也都适用,尤其是那些长期不会变更的,中间逻辑又很繁琐耗时的场景。
希望这种技巧对大家有所帮助。
如果大家对于这样的做法有自己的一些不同看法,请踊跃发言,在下洗耳恭听。
谢谢。