C# 中的关键字ref 与out, param, lock


如果没有用ref/out,那么,在函数体中对参数的更改,其有效范围只在当前函数体内,出了该函数,参数的值便不再保留。

ref:(引用型参数)引用类型的参数不再分配内存空间,实际上传递的是指向原变量的指针,即引用参数和原变量保存的是同一个地址。在方法中修改引用参数的值实际上也就是修改被引用的变量的值。
out: 使用out表明该引用参数是用于输出的,而且调用该参数是不需要对参数进行初始化。
即:refout参数都是通过引用传值,ref参数在调用前必须初始化,out参数在返回前必须初始化,refout参数的编译处理相同,但是在运行时的处理方式不同。
客户端在调用具有ref/out参数的函数时,先取得参数的地址,然后把该地址传给被调用参数。

params: 声明参数的个数不确定。 在调用具有params参数的函数的时候,客户端先把这些params参数转换为一个数组,然后把该数组传递给被调用的参数。

lock: 在多线程的程序中经常会遇到,多个线程要对一个对象进行操作的情况, 这样的话, 如果没有一个线程的控制的话一定会造成数据的损坏。比如两个现成要对同一个数组进行操作一个需要对数组进行加操作而另一个则要进行减操作。在这种情况下如果没有lock那就会很容易的出现超出数组界限的事情。

lock关键字,使用的就是Monitor.Enter和Monitor.Exit,也就是说lock(this)时执行Monitor.Enter(this),大括号结束时执行Monitor.Exit(this).
他的意义在于:对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock. 就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数。
posted @ 2008-06-04 18:17  Amanda2007  阅读(500)  评论(0编辑  收藏  举报