Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C# 学习笔记 (1)

Posted on 2008-04-02 23:33 ZelluX 阅读(1338) 评论(14)  编辑  收藏 所属分类: OOP
这语言真不错,不像Java那么呆,可惜不开源。
入门看的书是CLR via C#中文版,翻译质量不错,起码到现在还没觉得有必要翻一翻原版(不过为什么中文书都喜欢把“栈”叫成“堆栈”呢)。
前面几章粗略看了下,从第四章类型基础开始重点阅读。
继续漫无目的的学习感兴趣的东西,学习之中经常会惊喜的发现,自己看问题的角度已经不同于之前了。

1. 类的new操作会递归调用该类的所有父类构造器,直到System.Object,后者的构造器只是简单返回,用ILDasm查看MSCorLib.dll可以证实这一点。

2. is和as操作符,is类似于Java中的instanceof,as会先检查类型,如果兼容返回该对象的引用,反之返回null。
Emplooee e = o as Employee;
if (e != null{
    
// blah
}
利用as可以做到只检验一次对象类型,提高程序性能。这本书的很多地方都提到了性能因素。

3. 方法调用和x86上汇编语言调用机制很类似。先是参数入栈,接着返回地址入栈,返回的时候也差不多。不知道x64等寄存器较多的架构上会不会使用寄存器传参呢,呵呵。

4. 作为方法的prologue的一部分,CLR会自动将所有局部变量初始化为null或0。感觉这个自动初始化没什么必要,在第五章可以看到。
SomeVal v1;
SomeVal v1 
= new SomeVal();
这里的SomeVal都是值类型,CLR都会将它们初始化为0。区别在于C#认为前者没有初始化,直接使用这个值会报错;而后者在不赋值的情况下使用这个值。
可能这是CLR和C#之间不统一导致的冗余步骤吧。

5. CLR开始在一个进程中运行时,会给System.Type类型创建一个实例,每个类都会包含指向System.Type类型的指针。

6. CLR提供了执行溢出检查的计算指令,例如add.ovf对应add,mul.ovf对应mul。C#中默认关闭溢出检查。
可以使用checked关键字使用溢出检查。一般情况下,对预计可能发生溢出的代码放到checked块中,对允许溢出的代码(比如计算hash值)放到一个unchecked块中,其他情况,Debug时打开编译器的/checked+开关,Release版本关闭。

7. 所有的值类型都是从System.ValueType继承的。后者重写了Equals方法,比较两个值对象是否完全相等。

8. boxing和unboxing。
boxing:托管堆中分配内存,复制值类型,然后返回对象地址。
unboxing:相当于一个通过指针取值的过程,不过这个指针是已装箱部分中的实际值部分。

9. FCL(Framework Class Library)中包含了支持值类型的泛型容器类,不需要对容器中的元素进行boxing/unboxing处理。
不过这里就有个问题了,值类型的话是放在栈上的,生命周期小于容器的,这个怎么处理呢?
第16章才详细解释泛型,先把这个问题留着吧 =,=

10. 依然是性能问题。有时候编译器会反复对一个值类型boxing,此时手动boxing会提高一些性能。
Int32 v = 5;
// 需三次boxing
Console.WriteLine("{0}, {1}, {2}", v, v, v);

// 只需一次boxing
Object o = v;
Console.WriteLine(
"{0}, {1}, {2}", o, o, o);

接下来书上举了个很搞的例子说明boxing和unboxing的各种情况,其实也很容易理解。

评论

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-02 23:40 by ha
有时候觉得语言提供太多语法未必简化了开发... 反而增加了复杂度

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-02 23:46 by ZelluX
@ha
C#语法不至于“太多”啊,粗看一下,delegate generics都是很好用的东西,3.0加入functional programming的元素应该会想当强大。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 00:23 by BeanSoft
有开源的啊 MONO.... Linux 下面可用,不过没玩过。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 00:24 by ZelluX
@BeanSoft
我用过。用起来也不错。但是不算官方实现吧。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 00:57 by robertlyc
扯 自动装箱拆箱也能扯半天
还敢说Java呆

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 08:26 by Matthew Chen
对于9,值类型是放在栈上,不过严格上讲,值类型其实是可复制的结构体,boxing就是在堆上分配类空间,将其中一部分用结构体赋值(即复制)得到,所以看有些书上说值类型只存在栈上,其实任何类类型都可能存在对值类型的引用,而栈空间并非在类的生命周期中都可用,所以值类型的数据其实是可能保存在栈上的。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 09:06 by TiGERTiAN
开放了源代码,只不过不能修改,编译再发布而已。。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 09:15 by ZelluX
@robertlyc
好吧,各么说的更明确些,援引Pixadel话,
Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDN'T be like.

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 09:17 by ZelluX
@Matthew Chen
恩,我也刚想到其实在创建容器的时候只要复制一下值就行了,写的时候只考虑到在容器里保留指针的实现方法了。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 09:17 by ZelluX
@TiGERTiAN
好吧 >,<

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 11:53 by ZelluX
@zht
这英语。。。
Java程序的冗余代码多是个事实吧,有什么好争的。
语言表达能力的欠缺,比如写个swap都得封装。
不过据说以后版本会引入closure和lambda,期待一下。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 14:51 by ZelluX
@zht
"That's a direct quote from the Spring 2005 report."
比较早的新闻了。而且具体评价方法也没给出。
再看看后面的评论
"sounds good, but this just doesn't fit with my experience as a desktop end-user - where are all the swing apps? I'm seeing SWT based creations, eclipse rcp based creations but no swing "
"Congratulations, but upon reflection I don't think I use a single Swing app on a daily basis. I use Eclipse, Firefox, Thunderbird, Gmail (AJAX), TextPad, OpenOffice, Palm, VNC. I used to use IntelliJ, but switched companies and we are Eclipse-based. What do other developers use? david www.testdriven.com "

退一步讲
即使Swing真的占支配地位了,又能说明Java这个语言本身的什么呢?
只能说这个框架做得越来越好了,主要的原因还是市场的推动。
否则为什么Delphi这样优秀的语言会逐渐没落呢?
新生的Erlang又为什么没有引起足够的重视呢?

而且我只用了“呆”这个形容词。说的好听点就是“中规中矩,按部就班”。这对一门工业语言来说不一定是坏事啊,不一定好的语言要像Ruby一样,不同水平的人写出来的代码高下立判。只是我不喜欢这种有点八股文风格的语言罢了。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-03 16:32 by BeanSoft
呵呵 是呀 导弹和蚊子拍都有不同的使用场地。脱离上下文讨论语言的好坏,是没有意义的。Java就是那种几乎什么都能来一手的语言。

# re: C# 学习笔记 (1)  回复  更多评论   

2008-04-04 18:59 by 孤帆1
=====================================
3. 方法调用和x86上汇编语言调用机制很类似。先是参数入栈,接着返回地址入栈,返回的时候也差不多。不知道x64等寄存器较多的架构上会不会使用寄存器传参呢,呵呵。
=====================================
呵呵现在还能知道这个东西的人好像人不是很多了.

正好我近期正在学习j2me,在学校时学过java的课程,不过那时我已经使用了C#.
语言没有太多好争议的,C#出现的时机比java迟,不得不承认有很多新的亮点.
很多设计更加的人性化、简洁.

只有注册用户登录后才能发表评论。


网站导航: