随笔分类 -  C#基础知识

摘要:CLR要求将接口方法标记为virtual,如果源代码中没有显示地将方法标记为virtual,编译器会将它们标记为virtual和sealed,这会阻止派生类重写接口方法。 一个类型加载到CLR中时,会为该类型创建并初始化一个方法表。在这个方法表中,类型引入的每个新方法都有一条对应的记录项;另外,还为该类型继承的所有虚方法添加了记录项。 可以用显示接口方法实现(EIMI)来增强编译时的类型安全性:... 阅读全文
posted @ 2011-05-25 22:25 我就是砖家 阅读(211) 评论(0) 推荐(0)
摘要:读了园子中一些前辈的关于C#中协变与逆变的文章,收获很大,分享一下我的个人理解,希望用较浅显的方式理解这个比较绕弯的概念。 协变与逆变应该是CLR的特性,我仅对我熟悉的C#举例说明。 说白了,它主要解决的是一个类型转换的问题,用一个最简单的泛型表达式就是: S<T1> = S<T2> 当然这只是一个抽象的表达式,而且只包含了一个泛型类型参数,意思是将一个S<T2>的实例赋值给一个S<T1>的实例... 阅读全文
posted @ 2011-05-08 00:59 我就是砖家 阅读(1943) 评论(3) 推荐(3)
摘要:今天Review时看到自己写的这样一段类似的代码: internal class TestClass{ private bool _inited = false; private int _count = 0;}简单地说就是一个类中的私有字段被显示地赋上了默认值。根据我们惯有的经验,这么做不仅多此一举,而且画蛇添足。因为false和0分别是bool型和int型的默认值,也即是如果我们没有显示赋值,... 阅读全文
posted @ 2011-05-04 23:35 我就是砖家 阅读(307) 评论(0) 推荐(0)
摘要:Tips: 可选参数和默认参数的配合: static void Test(){ M(c: 5);}static void M(int a = 1, int b = 2, int c = 3){ //do sth}这样可以前两个参数使用默认值。 从CLR的角度看,out和ref完全一致。C#编译器将这两个关键字区别对待,这个区别决定了由哪个方法负责初始化所引用的对象。 可以为索引器重命名,默认为It... 阅读全文
posted @ 2011-05-02 23:06 我就是砖家 阅读(209) 评论(0) 推荐(0)
摘要:做点笔记,不要遗漏自己觉得重要的或者以前不知道的东西,也督促自己学下去,不要半途而废。Tips:is和as操作符都会校验对象是否兼容于指定类型,强转也会检验。所以最佳搭配是as后判断是否为null,而不是is后as或is后强转。前者只会有一次校验,后者都会有两次。 命名空间是C#等的语言特性,CLR并不知道命名空间的任何事情。 类型对象中保存了类型对象指针,同步索引块,静态字段和方法(静态,虚,非虚)。方法执行时会先进行JIT编译(如果需要的话),然后调用JIT编译的代码。 JIT编译器会根据环境生成不同的CPU指令(如x86,x64等),所以方法在第一次执行时性能损耗较大,后边会有显著提高。 阅读全文
posted @ 2011-04-19 23:26 我就是砖家 阅读(297) 评论(1) 推荐(2)