C# 3.0学习总结

抽空看完了Scott Guthrie在他Blog上今年3,4月份发表的几篇关于“Orcas语言新特性”(New Orcas Language Features)的文章,至此,对于C#3.0的语言新特性也已经有了一个Overview上的认识。当然我也只是一个相当入门的级别而已。然而,这里作一个归纳,对Orcas感兴趣的帅哥靓妹可以从这里Get Started。
 
  • 自动属性:过去定义一个属性,我们需要先定义一个field,然后在属性中添加Set/Get Accessor。现在我们只要按照如下方式Coding: public string Size { get; set; } 编译器就会为我们产生定义Size属性所需要的一切。
  • 对象和集合初始化器:这两个本为一家,目的就是为了在实例化对象后,节省代码的输入量。(有点像JSON的感觉)如下:
Person person = new Person();
   person.FirstName = "Scott";
   person.LastName = "Guthrie";
   person.Age = 32; // 太长太复杂,以下一行就可以搞定
Person person = new Person { FirstName="Scott", LastName="Guthrie", Age=32 };
 
扩展方法使得我们可以为CLR中的某个Type添加方法,而不用重新去编译这个Type的Assembly。它的出现是为了给LINQ打基础。要知道LINQ中查询语法,其实编译器最终都是为我们产生了对这些Extension Methods的调用。他们都被包含在System.Linq命名空间中。
 
设计它的目的有两个:
  • 匿名方法:Lambda表达式就是一个Delegate的实例,这个在早先说过。
  • 表达式树(Expression Tree):这个是Linq to Sql实现高效数据查询的关键。这使得Linq to Sql引擎会去根据这个Tree获得的信息来创建合适的Sql表达式,然后发送到Database端去执行。这样所有的操作都是在数据库端完成的,而不用下载在本地内存中后再去执行。
这个其实是对以上这些知识的综合运用了,Linq特色的语法。其实以上这些语言特性都是被了Linq的实现作准备的,但是他们各自又都可以被独立使用。
 
某些类型可能只是在某个语句块中才会被使用到。我们没有必要去自定义一个这样的类。这就和匿名方法产生的原因雷同。同时,匿名类型也引出了Var关键字的使用,这使得让编译器来为我们推荐数据类型。然而由于匿名类型的Type Name是未知的,所以我们只能用Var来引用。
var product = new {
    Id = 1232;
    Name = "Piano";
    UnitPrice = 100.00;
    TotalRevenue = 100000.00};

Live Space 共享空间无法访问

昨天晚上更新Live Space,添加了一首背景音乐,至此就无论如何都上不了空间了。每次点击进入Space都会提示说“此共享空间暂时不可用,请稍后再试。”等等xx字样。郁闷,以为是Live Space又在进行什么升级了吧。早上再次登录,还是没法进去。Google了一下,最终找到了症结。
 
这个是Live Space的一个Bug,只要将Media Player显示为无就会出现这个问题。所以各位小白们如果遇到了这个问题千万别白白地去等啊,否则除了到下次更新,你将永远无法编辑你的空间(即使骂MS也没用)。汗汗~~
 
解决办法是修改URL,进入Media Player的编辑界面,注销这个选项。键入的URL如下:http://[Space Name].spaces.live.com/?_c=WMP 详细信息请参考如下MSFT的Space: http://gb2312.spaces.live.com/

My Generation – YUI

My Generation/Understand
YUI new single 2007.6.13 release
 
グランドに吹いた風を
ちいさな窓から吸い込んで ため息
期待することに イヤんなって
孤独になったけれど
でも諦めたつもりじゃなかった
チャイムが鳴り終われば
現実はもっと 早く進んでゆくでしょ?
窓ガラス 割るような
気持ちとはちょっと 違ってたんだ
はじめから自由よ
My Dream 言葉に出来ないだけなのに
誰でもいいからと傷つけて泣いた夜
わかってほしいなんて思わないけど
描いた夢を信じきれない弱さにただ支配されてた
Sixteen My Dream
制服 脱ぎ捨てた16のアタシに
負けたくはないから
うしろ指 さされたって
振り向いたりしなかった
あたしならまだやれるはずだって
犠牲にできないのは
こみ上げる希望 無くしたら
また道に迷うだけ
邪魔なんてされたくない
わかっているの 覚悟があれば
いつだって自由よ
My Dream 壊れることなんてないから
待ちきれない季節の中 歩き始めたの
うつむいてた時間を取り戻して
描いた夢を強く信じきれた時から
変わるGeneration
Sixteen My Dream
ひび割れた校舎の壁にもたれて
誓ったの 叶えてみせるから
My Dream 言葉に出来ないだけなのに
描いた夢を信じきれない弱さにただ支配されてた
Sixteen My Dream
 

Constrained Execution Region

刚才在博客堂上看了一篇很不错的关于CER入门的文章,是“装配脑袋”大哥写的。牛人就是牛人,同时也感觉到了自己的渺小,以及.NET技术范畴的广阔。[原文可以在这里找到:http://blog.joycode.com/ninputer/]当然写得有些晦涩,牛人的文章大多如此,所以这里通俗化一下。
 
CER(Constrained Execution Region)的作用就是,保证它所修饰的一段代码绝对能够运行(特别是在CLR异常OutOfMemoryException、StackOverflowException和ThreadAbortException等,namly,相当严重的异常,被抛出的时候确保执行)。设计它的目的在于保护一段重要的代码块可以在任何条件中成功运行。引用文中的话就是“CER的宗旨就是在执行之前将所有可以知道的情况尽数分析透彻以便提前判断CER中的操作到底有没有可能顺利完成。
 
至于为什么CER中的所有函数都要被早绑定或者说是本地编译,我的理解是为了让这些代码能够在可以预料的前提下执行。如果是虚函数,那么要用PrepareMethod,如果是delegate则用PrepareDelegate。否则晚绑定的情况下,所调用的函数也许就会去堆上分配内存,执行装箱操作,或者线程同步等CER内禁止的操作。
 
最后使用CER的方式,基本上如下:
System.Runtime.CompilerServices.RuntimeHelpers.PrepareContrainedRegions();
try { //… }
catch (Exception e) { //… CER block}
finally { //… CER block}
CER只能存在于catch和finally语句块中。

UTF8的认识

Char Set以及Encoding的问题一直都让我感觉很困扰。(很搞!~)特别是UTF和Unicode之间的问题,其实一直以来我就是把UTF当作Unicode来用的。还好他们都是同类,只是编码组织上有区别罢了。否则很难想象以前自己写过的代码可以works fine。
 
今天在跑Final Check R!的Test Case的时候,需要创建ODBC数据源,然后MySQL的ODBC driver貌似对部分Char Set支持的不好,然后在FileMaker上显示为乱码。然后和同事无意中谈起了Unicode的问题,他说Unicode是3Bytes。我那时候听了突然间很闷,因为Unicode是16位编码,这个是曾经万院长一直在我们面前强调过的。我不相信,他就演示给我看,结果发现他是以UTF来保存中文文本,而不是Unicode。一个中文字被分配了3个byte。
 
然后稍微花了点点时间研究了下,至此UTF和Unicode的区别终于搞清楚了。整理如下:
 
因为一个英文字母还有一些键盘上的符号只用七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!
  1. 当要表示的内容是 7位 的时候就用一个字节:0*******   第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。
  2. 当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******   第一个字节的110和第二个字节的10为标志位。
  3. 当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******    和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。