关于 ? 和 ??
int? p = null;
int res = p * 2 ?? 5;
?代表这个类型是可空的,而??是为了应对当出现空值的时候所默认的值
可空类型总是基于另一个叫做基础类型的已经被声明的类型
可以从任何值类型创建可空类型. 包括预定义的简单类型
不能从引用类型或其他可空类型创建可空类型
不能在代码中显示声明可空类型, 只能声明可空类型的变量 .
浅比较和深比较(引用类型)
浅比较: 如果引用类型相等,内存中指向同一个对象,那么返回ture,否则为false,即便两个对象的其他方面都完全相等
深比较: 委托比较 引用类型是否拥有相容的数目的成员,并且调用列表相匹配,那么返回true. string的比较也是深比较,它们比较字符串长度和大小写敏感内容
带有命名空间名称和类名的整体字符串被称为完全限定名
无用字段别序列化
节省空间,类型在序列化后往往会存储在某个地方,如数据库,硬盘或内存中,如果一个字段在反序列化后不需要保持状态,那它就不应该被序列化,这会占用宝贵的空间资源,
反序列化后字段信息已经没有意义了.
由于业务原因不允许被序列化.列入明文密码不应该被序列化后一同保存在文件中.
如果字段本身所对应的类型在代码中未被设定为可序列化,那它就该标注为不可序列化
类型被添加Serializable属性后,默认所有的字段全部能够被序列化.
特性 Attribute
可以声明式地为代码中的目标元素添加注解.运行时可以通过查询这些托管模块中的元数据信息,达到改变目标元素运行时行为的目的.
其中System.Runtime.Seriazation有以下四个特性:
OnDeseralizedAttribute,当它应用于某方法时,会指定在对象反序列化后立即调用此方法
OnDeseralizingAttribute, 当它应用于某方法时,会指定在反序列化对象时调用此方法
OnSerializedAttribute ,如果对象使徒应用于某方法,则应指定在序列化该对象后是否调用该方法.
OnSeralizingAttrubute,当它应用于某个方法时,会指定在对象序列化前调用此方法.