博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中Static的妙用
阅读量:6848 次
发布时间:2019-06-26

本文共 2638 字,大约阅读时间需要 8 分钟。

本帖主要是想和大家分享一下我在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时,拿到的就是计算出的结果值。有效的省去了计算逻辑。 

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

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

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

谢谢。

转载于:https://www.cnblogs.com/ray1ee/archive/2012/11/15/2770972.html

你可能感兴趣的文章
迭代器模式
查看>>
github 仓库重命名(改名)
查看>>
web前端性能优化
查看>>
为基恩士 TM-3000 激光测量仪定制的测量管理系统
查看>>
java反射机制+工厂模式+配置文件----->在谈到spring配置文件
查看>>
linux 操作系统进程系列
查看>>
持续化集成工具jenkins环境搭建及配置
查看>>
CDN架构以及原理分析
查看>>
2016年3月7日作业
查看>>
HDFS DataBlockScanner
查看>>
MVC模式基本理解
查看>>
开源 java CMS - FreeCMS2.8会员登录
查看>>
ps学习笔记 11,12 路径,色彩调整
查看>>
MDaemonV15 版本新特性介绍
查看>>
【Guava】基于guava的重试组件Guava-Retryer
查看>>
第三阶段计划
查看>>
【BZOJ2428】[HAOI2006]均分数据
查看>>
搭建个人/企业私有存储云盘-kodexplorer
查看>>
Spring常用注解
查看>>
哥德巴赫猜想算法c#实现方法
查看>>