1)C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中;
2)C#中的所有内容都是在生命的类中,所有类都在命名空间中,using类似于C++中的#include,后面跟着命名空间的名称,用来调用命名空间;
3)C#中的变量在访问前必须先进行初始化,否则会发生编译错误;
4)值类型是在栈(stack)中分配的数据类型。它们包括了除字符串的所有基本和内建类型、结构和枚举类型;
5)引用类型在堆(heap)中分配内存,当其不再使用时,由C#中的自动由垃圾回收系统回收,引用类型包括:类、接口、集合类型(如数组)、字符串;
6)readonly 修饰符仅用于修饰类的数据成员,其与const数据成员不同之处在于const要求你在声明时进行直接初始化,而readonly可以先声明,然后再过程中再进行一次赋值;
7)C#中你不能对类进行多重继承,可以通过接口的方式实现;
8)C#的数组方括号在类型后面而不是在变量名后面,创建元素使用 new 运算符;
9)索引器用于书写一个可以通过使用 [] 像数组一样直接访问集合元素的方法,所需要做的只是指定待访问实例或元素的索引,如下所示:
class Shapes: CollectionBase
{
public void add(Shape shp){
List.Add(shp);}
//indexer
public Shape this[int index]{
get {
return (Shape) List[index];}
set{
List[index] = value;}
}
}
10)装箱的思想在 C# 中是创新的,所有的数据类型,无论是内建的还是用户定义的,都是从 System 命名空间的基类 object 继承的,所以基础的或是原始的类型打包为一个对象称为装箱,相反的处理称为拆箱。
4)函数的参数传递方式有三种,即按值传递、按引用传递和输出参数,按值传递就是普通的参数传递方式;按引用传递则类似于C++的按地址传递方式,只不过采用了ref关键字,如下所示:
int a= 5;
FunctionA(ref a); // 使用 ref,否则将引发编译时错误
Console.WriteLine(a); // 打印 20
void FunctionA(ref int Val)
{
int x= Val;
Val = x*4;
}
而输出参数的传递方式是只从函数返回值的参数,对输入值不要求,使用关键字out表示输出参数,如下所示:
int Val;
GetNodeValue(Val);
bool GetNodeValue(out int Val)
{
Val = value;
return true;
}
5)在C#中,数组也可以作为函数的参数,但是必须使用关键字params进行传递,并且只允许一个参数使用数组参数且是函数的最右边参数(即最后一个参数);
6)委托(delegate)可以让我们把函数引用到变量之中,就像C++中使用typedef来保存函数指针一样;