提要,此文章并不会记录过于基础的东西,只会记录个人认为比较重要的概念以及实用的代码,如果您是新手强烈建议阅读实体书,自己一步一步敲一遍
第七章 深入理解类
按照推荐的编码
属性比共有字段更好静态构造函数
不需要加访问修饰符直接在构造函数前加static,静态构造函数由系统调用,一般用于初始化静态成员。静态构造函数调用时机
1、类的任何实例被创建前 2、类的任何静态成员被引用前索引器
索引器和属性很像有get有set,索引器是可以重载的(返回类型和参数列表都可以不同)
returnType this[Type t1] //不止一个参数但最少一个参数
{
get {}
set {}
}
第八章 类和继承
internal
对程序集内部所有类可见、对程序集外部类不可见protected internal
对程序集内部所有类可见和继承该类的派生类可见。是并集
而不是交集
第九章 表达式和运算符
字符串字面量
中 例如@"\n"将不会解释为换行,编译器让相同的字符串字面量共享堆中同一内存位置比较问题
一般比较是比较2个引用是否相等,而字符串比较
是比较长度与内容
第十章 语句
using语句
内部会有隐式的try…finally来处理潜在的异常
第十一章 结构体
- 结构体和类类似,可以拥有实例构造函数和静态构造函数,但不允许拥有析构函数
当结构体用于返回值和参数时
将会创建它的副本,当有需要时可以配合ref/out使用
第十二章 枚举
设置枚举底层类型
每一个枚举成员都会被赋予一个底层类型的常量(默认为int)、所以我们可以显示的设置底层类型
public enum Enum1:ulong {}
public enum Enum2:byte {}
枚举的位标志[Flags]
可以获得更多的格式化信息等,这里引用了ET中Entity中的枚举
[Flags]
public enum Enum1 : byte
{
None = 0,
IsFromPool = 1, // 01
IsRegister = 1 << 1, // 10
IsComponent = 1 << 2, // 100
IsCreate = 1 << 3, // 1000
}
public enum Enum2 : byte
{
None = 0,
IsFromPool = 1, // 01
IsRegister = 1 << 1, // 10
IsComponent = 1 << 2, // 100
IsCreate = 1 << 3, // 1000
}
第十三章 数组
交错数组
数组的子数组也是数组,初始化也分两步
// 初始化顶层数组
int[][] int1 = new int[3][];
int1[0] = new int[]{ 1, 2, 3 };
int1[1] = new int[] { 1, 2, 3 };
int1[2] = new int[] { 1, 2, 3 };
注意点
CIL对于一维数组有特定的优化指令,而矩阵数组没有,所以一般可以考虑使用一维数组的交错数组。Clone
针对值类型数组Clone会是2个独立的数组、针对引用类型数组Clone也会是一个数组,但是数组中元素和原数组元素指向同一个对象,这里原文图挺好理解的
Array.Clear
将会将数组内所有元素,设置为默认值。
第十四、十五章 委托、事件 没啥特殊的
第十六章 接口
接口与as
如果将类实例强制转换为没有实现的接口会抛异常、但是如果使用as将会返回一个null。- 基类满足接口的实现,派生类将不用强制实现接口。
- 如果继承了多个接口,多个接口需要实现相同的函数,可通过显示实现
接口名.函数名
来实现。但是这样无法直接访问显示实现,需要转化成接口的引用才能调用 - 接口是可以继承的