AhDung

/*追求代码质量的野生码农*/

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  C#

摘要:------------------更新:201411190903------------------经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名的字段或属性,只要实现Reset和ShouldSerialize这俩方法就可以了。关于这俩方法,应该是... 阅读全文
posted @ 2014-11-18 21:08 ahdung 阅读(3497) 评论(6) 推荐(3) 编辑

摘要:---------------更新:201411201121---------------主要更新说明:将原bool recurse参数改为int depth,这样可以指定递归深度,而不是笼统的是否递归先别急着喷,请听我解释。诚然可以使用现成的Directory类下的GetFiles、GetDire... 阅读全文
posted @ 2014-11-17 19:20 ahdung 阅读(2392) 评论(0) 推荐(0) 编辑

摘要:本人在C#中进行小数舍入的时候常常会怀念Excel中的Round、RoundUp、RoundDown这几个函数,原因就是后者“接地气”,比较符合俺小老百姓的舍入要求,啥“银行家舍入法”就让银行家用去吧。今儿有空,就把它实现了一下,先温习一下这几个Excel函数的功能:Round(value, dig... 阅读全文
posted @ 2014-10-20 18:16 ahdung 阅读(3566) 评论(1) 推荐(3) 编辑

摘要:说明:【干净】指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”。前提:你对WS有编写权。就是说如果你调的是别人写的WS,那么也许只能通过字符串处理的方式才能得到干净的ex.Message。先看示例:- WS方法:... 阅读全文
posted @ 2014-09-03 12:47 ahdung 阅读(3843) 评论(2) 推荐(4) 编辑

摘要:环境:VS2010+ReSharper8先说答案:1、在Inspection Severity中设置Non-private accessibility为Warning。如图:该页面在ReSharper菜单→Options中。贴士:选项是可以搜索的,搜索框在选项区上方2、启用Solution Wide... 阅读全文
posted @ 2014-08-14 19:24 ahdung 阅读(1123) 评论(0) 推荐(0) 编辑

摘要:---------------------------更新:2014-05-19---------------------------优化了一下逻辑,就是既然可以通过设置BorderSide=None来不显示边框,那么再设计一个BorderMode.None就显得多余,即BorderMode枚举只需... 阅读全文
posted @ 2014-05-14 17:31 ahdung 阅读(10941) 评论(4) 推荐(6) 编辑

摘要:先解释一下何谓“划算”:假定一个Winform程序包含若干个窗体,每个窗体左上角都要显示图标(即要设置Form.Icon属性),该程序本身也要有个图标(用于在OS资源管理器中显示),所有这些图标都是一个样子——这是一种很常见的情形。如图:即同一个图标要用在程序本身和程序中的各个窗体之上。那么所谓“划算”就是指,在程序文件(exe)中只存储1份图标数据,所有要用到该图标的地方都从这里取。而不是存储多份,各取各的,因为这样显然会增大程序体积,很不“划算”。之所以有这个话题,是因为如果不注意操作技巧,就会造成同一个图标存储多份的情况,VS和编译器并没有智能到会帮我们自动清除冗余资源的地步。那么如何才 阅读全文
posted @ 2014-04-10 18:11 ahdung 阅读(2444) 评论(1) 推荐(3) 编辑

摘要:----------------更新:2014-04-21---------------蒙doggo兄指教,得知有更好的方法可以代替蹩脚的0尺寸Button法,即调用窗体的验证方法Form.Validate(),该方会触发窗体中焦点控件的Validating事件以验证数据,达到与0尺寸Button法... 阅读全文
posted @ 2014-03-24 12:07 ahdung 阅读(2650) 评论(4) 推荐(1) 编辑

摘要:回调方法中几乎都会存在获取委托实例的需求,进而通过委托实例调用EndInvoke以得到异步执行的返回值。在我看过的相关文章中,获取委托实例的方法几乎都是同一个,就是向BeginInvoke的最后一个参数(object型)传入委托实例,然后在回调方法中通过ar.AsyncState得到,甚至在《C#高级编程》一书中,还特地讲到最后这个object参数最适合传入委托实例本身,以便回调方法中获取到它。直到看了张子阳的《.Net之美》一书后(似有广告之嫌,但事实如此,我也就不避讳了),新学到一招,不需要传参,直接就能从ar得到委托实例。如下: ...... DemoDelegate del... 阅读全文
posted @ 2014-03-08 17:22 ahdung 阅读(1143) 评论(0) 推荐(1) 编辑

摘要:我时不时会遭遇这个操蛋问题,今天得闲研究了一下,解决如下:A、将窗体FormBorderStyle属性改为Fixed系,当然这会导致用户不能拖拉窗口大小,所以你可能需要B计划↓B、确保在【VS】中的【窗体】的Size.Width >= MinimumSize.Width + 8。如图:是的,只有下面大过上面至少8个像素,才是理想效果,至于为什么,没深究,大概可能跟NT6的Aero界面,边框大于XP有关。 阅读全文
posted @ 2013-08-09 18:24 ahdung 阅读(1137) 评论(2) 推荐(0) 编辑

摘要:这条语句:b ? "aaa" : "bbb" + "ccc";会解释为:b ? "aaa" : ("bbb" + "ccc");而不是:(b ? "aaa" : "bbb") + "ccc";所以喜欢用?:句式拼字串的猿友们得注意这个规则。详情参见:http://msdn.microsoft.com/zh-cn/library/ty67wk28(v=vs.90).aspx 阅读全文
posted @ 2013-07-27 14:53 ahdung 阅读(883) 评论(0) 推荐(0) 编辑

摘要:这鸟属性把我害苦过,特此敬告一下大家。具体表现在:获取时:在DateTimePicker.ValueChanged事件中,获取到的Text有可能是string.Empty!!!,特别当ValueChanged事件是在构造函数或Load、Shown等启动事件中触发时,得到string.Empty的几率增大;赋值时:有可能触发不了TextChanged事件(该事件默认不显示在设计器中,但的确是存在的);可能的原因:先看Value属性的setter源码:set{ bool flag = !DateTime.Equals(this.Value, value); if (!this.user... 阅读全文
posted @ 2013-07-26 16:46 ahdung 阅读(2005) 评论(5) 推荐(2) 编辑

摘要:有个c#程序在某台电脑上,执行某个操作时,总是会报如图错误:度娘一番,发现市面上常见的原因是配置文件中的特定节点的位置不对,或者配置文件损坏等等,而这个程序根本没有使用内置的配置文件方案,而是用的ini,所以不适用我的问题。由于这个程序不是我的,所以首先reflator出源码(c#这点让我纠结,一方面怕自己的程序被人反,另一方面又得益于此~可以反别人的,NND),调试追踪之下,发现居然是WebRequest.Create()引发的异常,这方法多数会因为传入的uri字串不合法而引发格式错误的异常,这次能引发上述错误还是头一次见(我想Create方法内部也是由其它类引发的,但没深究),anyway 阅读全文
posted @ 2013-07-15 16:30 ahdung 阅读(1882) 评论(0) 推荐(0) 编辑

摘要:经测这俩方法会锁住文件,导致程序运行期间无法对load过的程序集文件进行更名/删除/覆盖等等操作,考虑用Assembly.Load()文件字节组替代:Assembly.Load(File.ReadAllBytes(@"c:\a.exe"));注意Assembly.Load()的其它重载方法也可能会锁住文件~具体没尝试,可以确定的是Load文件字节组的方法不会,我猜是因为Load的是文件被读入到内存中的字节组,而不是处于文件系统上的文件本身,所以不会锁住文件~猜想而已,没深究。 阅读全文
posted @ 2013-06-26 17:35 ahdung 阅读(594) 评论(0) 推荐(0) 编辑

摘要:.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可,这一意识源于《NET设计规范:约定、惯用法与模式》一书中,P239和P240关于这俩方法的设计建议。按书中的字面理解,Close就应该设计为与Dispose一样的功能,是为了照顾自然语言的一种考量,的确对于有些类,说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用渠道而存在,本来只需一个Dispose就够了,事实上我也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。可是今天在 阅读全文
posted @ 2013-06-11 15:49 ahdung 阅读(4281) 评论(34) 推荐(7) 编辑

摘要:.Net本身没有封装对快捷方式的操作类,所以要在C#中操作快捷方式,需要借助“外力”。市面上常见的方法是通过Windows Script Host Object Model这个COM组件来完成。这种方法的缺憾是你的程序必须带上Interop.IWshRuntimeLibrary.dll这个文件(不过也许可以把这个dll并入exe中再动态加载什么的)。Anyway~今天说的是另一个途径——WMI(Windows Management Instrumentation),这个东东我了解不深,只知道很强大,几乎涉及win系统软硬件资源的方方面面,使用一种叫WQL的查询语言(SQL它妹)获取资源信息,我 阅读全文
posted @ 2013-06-07 13:40 ahdung 阅读(1603) 评论(1) 推荐(1) 编辑

摘要:这两对属性光从MSDN上看不出什么区别,在到底选用其中哪个属性时给我造成过困扰,后来冥冥中觉得它们之间可能有关联,遂决定实验一下:果然,它们之间内部是私通的,赋值其中一个,另一个会跟着改变。通过反编,发现SqlDbType和DbType是通过一个叫MetaType的类实现的私通(这个类是internal的,所以外部不能访问),而SqlValue和Value则是通过SqlParameter类中的一个私有字段_value实现私通,具体此处不详谈。总之知道这两对基友有联动就行了,以后不用再纠结用哪一个。PS:其实MSDN中有提到SqlDbType和DbType之间是有联动的,参看http://msd 阅读全文
posted @ 2013-05-27 16:47 ahdung 阅读(943) 评论(3) 推荐(0) 编辑

摘要:功能:可防止exe更名、挪动位置再运行的问题实现思路:在Main()方法开始时遍历所有进程,获取每个进程的程序集GUID和PID,若发现有跟自己GUID相同且PID不同的进程,就勒令自身退出。注:1、采用GUID是为了尽可能保证判定的可靠性,采用进程名太不靠谱。因为程序集GUID是建立项目时就生成的,不随版本、内容的变化而变化,所以除非人为改动,否则同一项目编译若干次都还是那个GUID,用来判断程序集身份再适合不过。题外,市面上常见的互斥体方法,互斥名也建议采用GUID;2、之所以要加上进程ID的判断,是因为遍历的进程中已经包含自身进程,所以必须排除自身;3、经尝试似乎只有.Net程序集才能获 阅读全文
posted @ 2012-05-21 16:16 ahdung 阅读(2044) 评论(9) 推荐(4) 编辑