随笔分类 - C#
摘要:Func<T,T> func 作为某函数的参数,当调用该函数,必然会产生112b的gc alloc
阅读全文
摘要:##using语句定义: 提供可确保正确使用 IDisposable 对象的方便语法。 eg: string manyLines=@"This is line one This is line two Here is line three The penultimate line is line f
阅读全文
摘要:bool → System.Boolean (布尔型,其值为 true 或者 false) byte → System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255) sbyte → System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -12
阅读全文
摘要:###不建议用GetHashCode做Object唯一标识(官方) You should not assume that equal hash codes imply object equality. You should never persist or use a hash code outsi
阅读全文
摘要:##提升性能 字符串留用:内部哈希表来留存字符串 (key:字符串,value:string对象) 局限性: 如果留用的复用性不高,反而总体性能下降。因为留用操作会有消耗 (这正是C#编辑器默认不开启留用的原因) //CLR不同版本,字面值(literal)的引用有可能是同一个对象(字符串留用),也
阅读全文
摘要:##8.7分部方法 解决两个问题(相对子类覆盖基类虚函数的做法): 1,摆脱“非密封类”的限制。 2,好处在于什么都不做的时候 省掉,空函数的调用(虚函数-空函数)。 分部的方法的核心就是在一个地方定义,在另外一个地方声明,只要定义了就可以在代码里使用,如果没有声明,在编译器会自动删除调用的代码。
阅读全文
摘要:IL代码检测Main的代码引用的所有类型,分配一个内部结构来管理都引用类型的访问 jitcompiler: 1 在元数据中查找被调用的方法 2 从元数据中获取该方法的IL 3 分配内存块 4 将IL编译成本机cpu指令,存到3分配的地址 5在type表修改与方法对应的条目,使它指向步骤3的内存块 6
阅读全文
摘要:##4.4运行时的相互关系 (源代码、IL、JIT编译的代码之间的关系) CLR创建线程时,会创建1M的栈。用于方法传递实参和方法内部的局部变量。(高位向低位构建) 线程栈的工作流程: 执行的前后会有两个额外的方法初始化和收尾处理。 A、局部变量压入栈 B、 C、 下图过程解释: 1 堆中初始化类型
阅读全文
摘要:细读:都要读懂,要都理解了,读不懂反复读,找额外资料读。 通读:大致都了解可以干嘛,尽量看懂。 粗读:随手翻下,读不懂可以跳过,时不时回头看看。以第4版为例: (细读:4-21、26) Ch1通读。 Ch2和3粗读。 Ch4到19:细读,全是基础内容。 Ch20细读,最后两节(CER和Code Co
阅读全文
摘要:选择Struct的原则 该类型的实例较小且通常为短生存期,或者通常嵌入到其他对象中。 它以逻辑方式表示单个值,类似于基元类型( int 、等 double )。 它的实例大小为16字节。 它是不可变的。 它不需要频繁装箱。
阅读全文
摘要:#笔记 编译器的工作流水线: 源代码-词法分析-语法分析-语义分析-目标代码-链接-可执行文件 (现代编译器会更复杂,比如优化) 虚拟机执行中间代码的方式分为 2 种:解释执行和 JIT(即时编译)。解释执行即逐条执行每条指令,JIT 则是先将中间代码在开始运行的时候编译成机器码,然后执行机器码。
阅读全文
摘要:前言:很多文章描述过于复杂故整理之。 ##1C# Dictionary设计思想: ###1.1 数据结构 创建大小为size的数组entries(用来存放字典元素--以下称:entry) 创建桶buckets数组记录entry的index(大小和entries保持一致) entry结构体:hash、
阅读全文