注释
除了普通的//与/* */之外,可以使用///,用///可以被编译成XML文件。
所以你这个被你注释的类在其它地方也可以显示出来你注释的东西。
常量
在C#中一般建议使用const
与cpp有区别,const一般会在编译时就把变量全部替换为我们定义的常量。
而还有一种用来表示只读的不能修改的readonly
这个是在运行时常量,在运行时被赋值后就不可以更改。
装箱与拆箱
C#中有装箱和拆箱操作,装箱就是会将值类型转换为引用类型,所以会在托管堆中分配内存,如果装箱操作过多,就会一直会分配内存,对性能有较大影响,拆箱反之。
struct与class
一般在使用不可变的类型时尽量使用struct,因为struct是值类型在栈中,访问快(避免里面的值变化),就是在使用struct时尽量不要有函数去操作自己的值。而class反之。
静态成员与函数
静态成员是类所拥有的,每个对象共用。而静态方法就是来访问它的,静态方法在对象实例前就可以使用(静态构造函数在对象实例化时执行,执行一次)。
面向对象-继承
C#只能单继承类,就是只能继承一个基类,但是可以继承多个接口。
如果基类是抽象类abstract,那么基类不能实例化,只能做基类。
继承的接口里一般只包含方法,因为只要继承了接口就必须重写这个接口里面申明的函数方法,一般使用场景就是利用多态去访问继承于此接口的不同类的重载的实现方法。
但是也可以在基类中使用virtual来让子类重载可以达到一样的效果。
加入没有使用virtual,而子类又写了与基类一样的函数方法,那么可以使用隐藏成员语法,就是在前面加上new关键字
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
还有一个sealed关键字,表示不能再继承了,与cpp的final类似功能。
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
高级特性:委托、事件、反射、特性、Linq可以详细的在微软docs上查看如何使用