为什么类型和实例对象都要类型对象指针方法和类型所需的内存是在一起分配的,方法被类型和实例对象共享,在实例化一个对象的时候不会为方法分配内存,而调用方法时只能通过类型对象指针定位到方法表中相应的方法,进行调用
==与Equals的区别:值类型他们的效果是一样的,因为值类型分配在线程栈上,存的就是值,直接比较的就是值引用类型:==判断是否指向同一个地址;Equals比较的是变量所指的内存中的数据是否相同
Dictionary时间复杂度:Add;ContainsKey;Remove;TryGetValue为O(1),只有ContainsValue为O(n);因为前者根据哈希算法直接定位到数组索引,而后者却要遍历数组做比较;Remove和Add并没有发生数组元素的移动,数组是预先分配好的,Add只是填充,而Remove只是将对应的元素都置为初始状态
不要把动态的内容存在不能修改的缓存中,如存在静态字段中,如果内容改了,缓存中内容却改不了,如果存在静态字段中,可以隔一段时间更新一下,或者让你的缓存依赖某个文件。总之要让自己可以控制缓存中的内容
int映射到FCL中System.Int32,string映射到FCL中System.String,他们没有区别,相当于using int=System.Int32
值类型赋值是逐一对字段赋值,将一个很大的结构体当做实参传递是很低效的,如果这个结构体有1000个字段,那就要赋值1000次,而引用类型赋值,只是修改指针指向,说明将Class修改成Struct并不一定能提升性能,struct的类型实例一定要小
拆箱其实是一个获得一个指针的过程,该指针指向对象的数据部分,紧接其后是一个赋值动作,拆箱就是把引用类型赋给值类型,其实是赋给一个中间变量,然后你就可以调用值类型的方法了
在foreach循环读取数组中的元素的同时添加或删除元素,都会报InvalidOperationException异常,因为添加和删除都会修改字段version的值,而MoveNext里面会判断version的值和数组元素的个数是否发生变化,如果发生变化就报这个异常
为什么类型和实例对象都要类型对象指针 方法和类型所需的内存是在一起分配的,方法被类型和实例对象共享,在实例化一个对象的时候不会 为方法分配内存,而调用方法时只能通过类型对象指针定位到方法表中相应的方法,进行调用
效率:静态方法>实例方法>虚方法 1:静态方法不需要判断对象是否为空,而实例方法需要判断调用该方法的对象是否为空 2:虚方法有一些额外代码,用于判断是调用父类的方法还是调用子类的实例方法。实例方法和虚方法都要进行非空检查,若为null,就会抛出你常见的NullReferenceException,而静态方法不需要进行非null检查,你见过调用静态方法抛这个异常吗?
金字塔、锥形结构、树形结构有很好的稳定性,能很好的分散压力负载
想了几十分钟没有找到好的解决方法,吃完饭后瞬间就找到了好的方案,感觉思路非常清晰,这就是正确的答案
一个简单的防攻击类
DataTable 转换成 List
作者:陈太汉