virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写;
virtual 修饰符不能与 static、abstract、private 或 override 修饰符一起使用。
不同于C++,C#不允许多继承,因此不存在由多继承产生的二义性问题;因此C#中不需要virtual修饰类;
abstract可以用于修饰类、方法、属性、索引器或事件声明,且修饰的类为抽象类,只能作为基类使用,不能实例化;不能用 sealed 修饰符修改抽象类,意味着该类不能被继承;
a?.b 或 a?[b]的运算逻辑是: 1、如果a是null,那么a.b和a[b]都会抛出空指针异常,而a?.b和a?[b]都返回null,而不会抛出异常 2、如果a不是null,那么a?.b和a?[b]等价于a.b和a[b],如果a.b和a[b]抛出异常,a?.b和a?[b]也会抛出相同的异常
expr1 ?? expr2 1、如果表达式expr1的结果是null,那么会计算表达式expr2,并返回表达式expr2的结果 2、如果表达式expr1的结果不是null,那么会直接返回表达式expr1的结果,此时并不会计算表达式expr2的结果
合并运算符(??)也可以类似级联的使用,与null 条件运算符(?.)一起使用时
合并运算符(??)还经常和throw表达式结合,用于简化空指针判断,它常出现在构造函数和属性构造器中
??=也称为合并赋值运算符,是合并运算符(??)的一个特殊情况,它类似于+=、-=等运算,用于简化赋值运算: