代码改变世界

随笔分类 - .net

对象锁感悟

2012-07-18 14:09 by 田志良, 2346 阅读, 收藏, 编辑
摘要:1、对于一个对象,读取对象元素无须加锁,增加、修改、删除、遍历须加锁。 2、如果对象a包含另外一个对象b,针对对象a的操作只要锁住对象a,针对对象b的操作只要锁住对象b。 3、如果对象a包含对象b,对象b包含对象c,对c的操作可以锁住c,可以锁住b,也可以锁住a,至于锁哪个,据具体的业务逻辑性能要求来定。 4、有时为了防止并发覆盖,可扩大锁范围。 阅读全文

反射调用性能比较(附源码)

2012-06-29 17:33 by 田志良, 6213 阅读, 收藏, 编辑
摘要:本文通过编写Demo,测试“传统反射”、“实例反射”、“快速反射”、“直接调用”的性能。 阅读全文

C#设计模式(外观模式)

2011-09-30 11:06 by 田志良, 3982 阅读, 收藏, 编辑
摘要:如果要观看电影,必须在客户端执行下面的操作:先打开投影仪,再打开功放机,再打开屏幕,再打开 DVD 播放机,再打开灯光,在经历了这么多操作后,才可以看一场电影。而在关闭电影的时候,也要先关闭投影仪,再关闭功放机,再关闭屏幕,再关闭 DVD 播放机,再关闭灯光。哦,这是太复杂了!!!在客户端居然有那么多操作,如果有一些用户不知道如何使用其中的一个工具,那他便看不了电影! 阅读全文

C#设计模式(适配器模式)

2011-09-29 16:50 by 田志良, 4819 阅读, 收藏, 编辑
摘要:众所周知,在中国通用的电压时 220V,而美国电压则是 110V,如果有经常在美国和中国之间跑的 IT 人,而其笔记本都是随身携带的,那么它的笔记本的电压问题如何解决呢?(因为在美国和中国电压不同,所以一般的电器会不通用的)而适配器在这个问题上体现得淋漓尽致。现在的笔记本都有一个电源适配器,而正是这个电源适配器来解决上面提到的适配器问题,比如,一款索尼笔记本,其输入电流为交流100V~240V,而输出则是统一的直流 19.5V,在电源适配器的一端输入交流电流,然后通过电源适配器把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西。 阅读全文

利用Anchor和Dock属性管理WinForm控件

2011-08-18 15:39 by 田志良, 1191 阅读, 收藏, 编辑
摘要:有一点让许多刚接触WinForms编程的开发者感到很棘手,就是在用户调整各种控件的大小时,怎样使它们的窗体保持同步,并与父窗体相称。这可以成为一种让人非常沮丧的情况,尤其是对于有着Web编程背景,转为WinForms的开发者来说。为了缓解这个问题,.NET框架允许你对子控件设置属性,命令在调整父窗体大小时,它们应该如何运作。用来命令控件在调整大小时动作的两个属性就是“Dock”和“Anchor”。Dock和Anchor通过将控件连接到它们父窗体的某个位置,而免除了使应用程序具有不可预知界面的麻烦。最好的一点就是设立这些属性不需要任何手写代码。所有事情都可以通过Visual Studio IDE中的点和单击来完成。 阅读全文

C#控件前缀名大全

2011-08-17 09:07 by 田志良, 1715 阅读, 收藏, 编辑
摘要:标准控件 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedTextBox 11 cdr MonthCalendar 12 icn NotifyIcon 13 nud NumeircUpDown 14 pic PictureBox 15 prg ProgressBar 16 rdo RadioButton 17 rtx RichTextBox 18 txt TextBox 19 tip ToolTip 20 tvw TreeView 21 wbs WebBrowser 阅读全文

WCF SOAP消息剖析

2011-07-22 16:06 by 田志良, 3520 阅读, 收藏, 编辑
摘要:小时候,我们学习到邮票应该贴在信封的右上角,地址应该写在中间。如果我们愿意,可以增加一个回复地址在信封的左上角。所有被处理的信件必须遵守这个基本的结构。如果格式不对,或者地址不清晰,或者地址不合法,邮政服务会认为这个邮件无效,并且无法投递。如果我们幸运的话,邮件会被退回(如果写地址的话)。可以想象没写地址有多混乱。如果发送者可以允许乱放邮票或者地址,邮政服务需要查遍整个信封来确定邮票和地址。很可能,为了完成新加投递任务,每次可能要增加远多于2美分的邮资。实际上,邮局定义的信封结构,从发信人角度来看,会改进信件处理的效率和一致性而不需要牺牲可用性。 阅读全文

WCF消息参与者

2011-07-22 15:36 by 田志良, 700 阅读, 收藏, 编辑
摘要:在面向服务的应用中,消息是通信的基本单位。因此,面向服务的应用通常被称为消息应用系统。在某一时刻,每个面向服务的应用系统都会发送或者接受消息。这个能够帮助你理解面向服务的消息很像你在Email系统里收到的信件一样。在邮件系统里,一个信件是抽象的实体:它可以包涵任何类型的信息,可以以不同的形式和大小存在,可以关联任何东西。同样,一个面向服务的消息也是一个抽象实体:它几乎可以包涵任何数据,可以使用许多不同的方式编码,并且可以关联到虚拟东西,甚至是其它消息。邮件的一些属性已经被广泛接受。例如,一封信件可以被某个人发送,邮寄给某个人,并且可能被某个人投递(某一时刻更多的是“可能”)。同样,一个面向服务的消息可以被计算机发送,发送给另一个计算机,并且可能由另外的计算机来投递。考虑某些喜欢死扣理论的书呆子,我必须澄清,与面向服务消息交互的实体不一定必须是计算机。理论上说,它们可以是信鸽,拉布拉多猎犬或者是狮虎。无论如何,这些与面向服务消息交互的实体被称作消息的参与者,并且在这本书里,一个消息参与者可以是一个计算机上的进程。 阅读全文

C#实现动态生成Word

2011-07-07 10:14 by 田志良, 10670 阅读, 收藏, 编辑
摘要:本篇文章主要介绍一个控制台例子,实现动态生成Word文件。 阅读全文

怎样编写注册表reg文件

2011-07-06 17:03 by 田志良, 2226 阅读, 收藏, 编辑
摘要:1、开头第一行一定是:“REGEDIT4”或“Windows Registry Editor Version 5.00”,以区别操作系统; 2、注册表信息头尾用“[”与“]”包起来; 3、" "内就是字符串内容; 4、“DWORD”为“0”就是用“dword:00000000”表示,因为“DWORD”值是16进位,16进位的“0”就是“00000000”。 5、因为本例中只有一行注册表信息([HKEY_CURRENT_USER\Software\Mi...]),所以没有空行。而如果有两个以上的注册表信息,信息与信息之间就需要有空行隔开。 6、如果要删除某个注册表信息该怎么办?很简单,在注册表信息前面加上“-”(减)号 阅读全文

C#线程优先级详解

2011-03-07 17:14 by 田志良, 15416 阅读, 收藏, 编辑
摘要:计算机中经常会有多个任务同时运行,其中总有一些看起来更紧急,更需要优先完成。比如我们现在有两个任务,一个任务是下载一部电影,另一个任务是检测用户的输入。显然及时响应用户操作应具有更高的优先级,因为我们不能让用户等得太久。 阅读全文

.net垃圾回收机制详解

2011-03-06 23:01 by 田志良, 1552 阅读, 收藏, 编辑
摘要:作为一个.NET程序员,我们知道托管代码的内存管理是自动的。.NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保证一切。好吧,有道理,有一定的道理。问题是,当我们用到非托管资源时.NET就不能自动管理了。这是因为非托管代码不受CLR(Common Language Runtime)控制,超出CLR的管理范围。那么如何处理这些非托管资源呢,.NET又是如何管理并释放托管资源的呢? 阅读全文

IDisposable接口详解

2011-03-04 19:52 by 田志良, 5096 阅读, 收藏, 编辑
摘要:本文详细介绍IDisposable在回收资源的应用。 阅读全文

ManualResetEvent详解

2011-03-04 11:25 by 田志良, 32241 阅读, 收藏, 编辑
摘要:本文着重讲解ManualResetEvent如何实现线程同步,并附源代码哦。 阅读全文

c#前台线程与后台线程的区别和联系

2011-03-03 16:16 by 田志良, 18132 阅读, 收藏, 编辑
摘要:.net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。 阅读全文

通用守护进程的实现

2011-02-12 11:55 by 田志良, 22762 阅读, 收藏, 编辑
摘要:用户指定要守护的应用程序(数量不限),该应用程序不仅包括exe可执行文件,还包括诸如jpg、txt等所有能双击打开执行的应用程序。用户设定好要守护的应用程序后,关闭应用程序(包括合法和非法关闭),该应用程序要能立即重启打开。当电脑重启时,要守护的应用程序也能自动全部打开。 阅读全文

远程应用程序域通信 MarshalByRefObject

2011-01-07 13:49 by 田志良, 2007 阅读, 收藏, 编辑
摘要:应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。MarshalByRefObject 就是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。 阅读全文

delegate,event, lambda,Func,Action以及Predicate

2011-01-06 15:56 by 田志良, 3407 阅读, 收藏, 编辑
摘要:1. delegate 委托 可以理解为cxx 语言中的函数指针,标示了方法调用的回调函数的规范。强类型,便于编译时检查是它的最大优点,从此可以和void * 说再见了。 2. event 事件 用以delegate委托声明事件,标示响应该事件的回调函数必须符合其声明委托的定义 3. lambda 表达式 在.net世界中表现为匿名委托,之前又要提到匿名方法(函数) 阅读全文

Lambda 表达式 和 Predicate 泛型委托

2011-01-06 14:36 by 田志良, 6585 阅读, 收藏, 编辑
摘要:“Lambda 表达式”是一个匿名函数,用于创建委托或表达式树类型。 “=>”为Lambda 运算符,读为“goes to”。Lambda 运算符左边是“输入参数”,右边是“表达式或语句块”,如下所示: delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } 阅读全文

浅析Base64

2010-12-01 17:31 by 田志良, 935 阅读, 收藏, 编辑
摘要:按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 阅读全文