1.类中的静态成员函数,静态变量,只能用类名调用,不能用对象调用(C++可以)
2.值类型:简单类型,结构体类型,枚举类型
引用类型:类,数组,接口,委托,string,当结构体作为类的字段或属性时在堆中,结构体实例在栈中,字段指向栈
3.值类型不允许未null,引用类型可以
4.Out与ref都是传递内存,ref在调用的时候要进行初始化,out可以不初始化,out指定的参数在进入函数时会清空自己,因此可以不需要赋值(C++里面的引用)
5.Sealed表明类不能被继承,或者方法不允许在派生类重写(c++里面的final)
6.抽象类与接口区别:接口是can do,类是is a,抽象类中的方法可以给出实现部分。
接口可以多继承而抽象类不可以。
7.抽象类:抽象类中的方法必须要实现抽象方法,抽象类不可以构造,但是可以声明例如
//a s=new a();//不可以通过抽象类构造 a s = new b();//可以声明
8. List就是vector,如果删除a[2],则a[3]就成了a2,增加元素是s.add();,如果列表声明时长度为10,增加元素的时候内存不够一次性就扩大10,s.count()获取的是存的数据的大小,不是容量的大小。
dictionary是map.add,增加,查询a[键名]删除a.remove(建名)修改a[键名]新值
常用方法:ContainsKey(l)是包含某个键,ContainsValue()是否包含这个值
9.委托与事件:
public delegate void GreetingDelegate(string name);定义委托,函数类型
public event GreetingDelegate MakeGreet;
public void GreetPeople(string name) {
if(makegreet!=NULL)
MakeGreet(name);
事件总是private的只能用-=或者+=
10.装箱与拆箱
值类型转换为引用类型的过程叫装箱,相反叫拆箱
13.base.student();是子类调用基类的一种方法
14.匿名类型是var,输入之后自动确定值,与C++auto类似
15.重写(override),覆盖(new),隐藏(new)
重写和覆盖都是针对虚函数的,重写之后会改变父类的方法,而覆盖不会。
隐藏是父类中的没有虚函数,但是子类有个与父类同名的。
(1)当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
(2)虚方法、实方法都可以被覆盖(new),抽象方法,接口 不可以。
(3)抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
(4)重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
16.派生类的构造与C++类似(有时间去看看C++)
Class Student(int x,int y):base(y){x=this.x}
17protect类型(C#不分继承):当没继承的时候和private一样,有继承的时候表示可以访问。
18.字符串(与C++很大不同):
字符串如果在初始化是确定了值就不可以修改!
string s = "aaa"; s = "bbb";//不能修改的意思是不能改变内存的值,这样可以是因为改变了s的指向,aaa在内存中还存在会被GC自动回收
19.string与stringBuilder
前者是不可改变的(内存),后者可以改变。
StringBuilder三种初始化方式:
stringbuilder sb=new stringbuilder(“aaa”);
Stringbuilder sb=new stringbuilder(20);
Stringbuilder sb=new stringbuilder(“aaaa”,1000);