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

浙公网安备 33010602011771号