2011年3月25日
摘要: 常数是在编译时嵌入代码中,所以常数在运行时不再需要任何内存分配。我们不能获取常数的地址,或以引用的方式来传递一个常数。 如果要求一个模块中的数值能够在运行时而非编译时被另一个模块获取,那就不应该使用常数,因为常数在编译时就已经被嵌入到程序的IL代码中了。这时,应该使用只读字段。 只读字段只能在构造器内被赋值,且在构造器内只读字段可以多次被赋值。 对于静态只读字段只能在静态构造器内赋值,静态构造器在该类型初次被引用时执行。 阅读全文
posted @ 2011-03-25 23:11 辛勤的代码工 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 对象的散列码: object提供了一个GetHashCode虚方法,我们可以从任何对象上得到一个Int32类型的散列码。 如果我们定义了一个类型,且重写了Equals方法,我们就应该重写GetHashCode方法。因为Hashtable类型的实现要求任何两个相等的对象都必须有相同的散列值。 object的GetHashCode方法返回的是一个在应用程序域范围内确保唯一的数值,该数值在对象的整个生存期中保证不会改变。但在对象被执行垃圾收集后,这个唯一的数值可以被重新利用作为一个新的对象的散列码。 ValueType中实现的GetHashCode方法使用反射来返回定义在类型中第一个实例字段的散列码 阅读全文
posted @ 2011-03-25 18:11 辛勤的代码工 阅读(485) 评论(2) 推荐(1) 编辑
摘要: System.Object类型提供了名为Equals的虚方法,目的为判断两个对象是否有相同的“值”。.Net框架类库(FCL)中许多方法在内部都调用了Equals方法(如:Array的IndexOf方法、ArrayList的Contains方法)。对于没有显式重写Equals的类型,Object(或重写了Equals方法的最近的那基类)提供的实现将被继承。以下代码展示了System.Object类型中的Equals方法实现: class object { public virtual Boolean Equals(object obj) { //如果引用指向的是同一对象,肯定相等 if (t. 阅读全文
posted @ 2011-03-25 17:23 辛勤的代码工 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 考虑以下代码:byte b = 100;b = (byte)(b+200); 这段代码在实际运行中是否会抛出溢出异常呢? 先不管答案,我们来看看CLR是如何应对溢出的: CLR提供的IL指令允许编译器选择自己期望的行为。CLR提供了一个名为add的指令,会直接对两个数做加法运算,而不做任何溢出检查。同时,CLR还提供了一个名为add.ovf的指令,它在对两数做加法运算时,一旦发出溢出,便会抛出一个System.OverflowException异常。除这两个加法运算指令外,CLR还提供了类似的减法(sub/sub.ovf)、乘法(mul/mul.ovf),以及数据转换(conv/conv.o. 阅读全文
posted @ 2011-03-25 12:56 辛勤的代码工 阅读(600) 评论(1) 推荐(0) 编辑
摘要: 延迟签名的作用: 当我们打包强命名程序时,必须使用安全的私有密钥来为之签名。然而在开发和测试程序集时,允许访问安全的私有密钥可能会导致私钥泄漏。为在开发与测试环境中保证私钥安全,.Net推出了延迟签名技术,也叫局部签名。延迟签名的步骤:开发程序集时,首先取得仅包含公司公有密钥的文件,并将以下两个特性加入到AssemblyInfo.cs文件中://指定公有密钥文件名[assembly:AssemblyKeyFile("MyCompany.Publickey")]//指定延迟签名特性为true[assembly:AssemblyDelaySign("true" 阅读全文
posted @ 2011-03-25 10:48 辛勤的代码工 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 如果一个程序集被多个应用程序所访问,为方便起见,应该将其放到一个CLR确知的目录下,这个目录即全局程序集缓存(GAC)。 全局程序集缓存所在路径一般为:c:\Windows\Assembly 向GAC中安装一个强命名程序集的常用工具为:GACUtil.exe 使用方法: 安装一个强命名程序集到GAC中 GACUtil /i xxx.dll 从GAC中删除一个强命名程序集 GACUtil /u xxx.dll GACUtil一般不会和客户应用程序一起发布,如果应用程序包括一些需要部署到GAC中的程序集,则必须的使用2.0版本以上的Windows安装器(MSI)。客户电脑上一般总是存在该工具。可. 阅读全文
posted @ 2011-03-25 10:47 辛勤的代码工 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 强命名程序集的创建使用SN(Strong Name Utility)工具创建密钥例:SN -k MyCompany.keys创建一个名为MyCompany.keys的密钥文件,该文件包含一对以二进制格式存储的公有密钥和私有密钥。查看公有密钥方法创建一个只含有公有密钥的文件SN -p MyCompany.keys MyCompany.Publickey查看公有密钥SN -tp MyCompany.Publickey显示如下:Microsoft (R) .NET Framework 强名称实用工具 版本 2.0.50727.42Copyright (c) Microsoft Corporation 阅读全文
posted @ 2011-03-25 10:46 辛勤的代码工 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 弱命名程序集与强命名程序集的区别:程序集部署:弱命名程序集只能进行私有部署,即只能部署在应用程序的基目录及子目录下;强命名程序集既可进行私有部署,也可进行全局部署。程序集定位:弱命名程序集可以在其清单元数据中嵌入版本号和语言文化特性,但CLR总会忽略版本号,仅利用程序集的名称进行定位,只有在搜寻子目录查找卫星程序集时才会使用其中的语言文化信息。强命名程序集包含4个唯一标识程序集的特性:文件名(不含扩展名)、版本号、语言文化标识、一个公有密钥标记(由公有密钥产生的一个值)。在定位时,唯有这4个特性完全匹配才能定位成功。 阅读全文
posted @ 2011-03-25 10:45 辛勤的代码工 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 当CLR要定位一个程序集时,它将扫描应用程序的几个子目录,下面是CLR扫描一个语言文化中性的程序集时的顺序: AppBase\AsmName.dll AppBase\AsmName\AsmName.dll 如果在上面的目录下没有找到该程序集,CLR将以.exe代替.dll扩展名来搜索。如果仍找不到,将抛出FileNotFoundException异常。 对于其他语言文化程序集(即卫星程序集)来说,除了期望被放在应用程序集目录下,且名字和语言文化相匹配的子目录外,其他规则仍适用。 以"en-US"为例,CLR将扫描以下目录: AppBase\en-US\AsmName.dll 阅读全文
posted @ 2011-03-25 10:44 辛勤的代码工 阅读(407) 评论(0) 推荐(0) 编辑
摘要: Timer类:设置一个定时器,定时执行用户指定的函数。定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。构造函数:Timer(TimerCallback callback, object state, int dueTime, int period)参数说明 callback:一个 System.Threading.TimerCallback 委托,表示要执行的方法。 state:一个包含回调方法要使用的信息的对象,或者为 null。 dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。指定 System.Threading.Timeout.Infinite 阅读全文
posted @ 2011-03-25 10:43 辛勤的代码工 阅读(7300) 评论(0) 推荐(0) 编辑
摘要: 同步事件和等待句柄用于解决复杂的同步情况。比如一个大的计算步骤包含3个步骤result = first term + second term + third term,如果现在想写个多线程程序,同时计算first term,second term 和third term,等所有3个步骤计算好后再把它们汇总起来,我们就需要使用到同步事件和等待句柄。 同步事件分有两个,分别为AutoResetEvent和ManualResetEvent,这两个类可以用来代表某个线程的运行状态:终止和非终止。 等待句柄用来判断ResetEvent的状态,如果是非终止状态就一直等待,否则放行,让等待句柄下面的代码继. 阅读全文
posted @ 2011-03-25 10:41 辛勤的代码工 阅读(1504) 评论(1) 推荐(0) 编辑
摘要: Monitor类功效和lock类似: 1 System.Object obj = (System.Object)x; 2 System.Threading.Monitor.Enter(obj); 3 try 4 { 5 DoSomething(); 6 } 7 finally 8 { 9 System.Threading.Monitor.Exit(obj);10 } lock关键字比Monitor简洁,其实lock就是对Monitor的Enter和Exit的一个封装。 另外,Monitor还有几个常用的方法: (1) TryEnter TryEnter能够有效的决绝长期死等的问题,如果在一个并 阅读全文
posted @ 2011-03-25 10:39 辛勤的代码工 阅读(1503) 评论(0) 推荐(0) 编辑
摘要: 我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot属性,他们之间有联系吗?我怎么才能用好他们呢? 以Hashtable为例,看看他们的基本用法:1 Hashtable ht = Hashtable.Synchronized(new Hashtable());2 lock (ht.SyncRoot)3 {4 ......5 } Synchronized表示返回一个线程安全的Hashtable,什么样的 hashtable才是一个线程安全的呢?下边我们就从.NET的源码开始理解。1 public static . 阅读全文
posted @ 2011-03-25 10:27 辛勤的代码工 阅读(9333) 评论(2) 推荐(0) 编辑
摘要: 1.避免锁定public类型对象。 如果实例可以被公共访问,将出现lock(this)问题。 如有一个类MyClass,该类有一个Method方法通过lock(this)来实现互斥: 1 public class MyClass 2 { 3 public void Method() 4 { 5 lock(this) 6 { 7 ...... 8 } 9 }10 } 如果一个MyClass的实例在不同线程中执行Method方法,可以实现互斥。但如果多个MyClass的实例分别在不同的线程中执行Method方法,互斥将失效,因为此处的lock(this)仅对当前的实例对象进行了加锁。2.禁止锁定类 阅读全文
posted @ 2011-03-25 10:25 辛勤的代码工 阅读(2472) 评论(5) 推荐(4) 编辑