1.1 官方编程文档
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Specifications\2052\CSharp Language Specification.doc
1.2 类与结构
结构只能定义带参构造函数,不能继承和派生,但可以实现接口
结构中不能实例字段初始值
1.3 引用类型与值类型
类是引用类型
class Program { static void Main(string[] args) { person p1 = new person(); person p2 = p1; p1.Name = "Jack"; p1.Age = 30; Console.WriteLine(p2.Name + p2.Age.ToString()); p1.Name = "Bob"; p1.Age = 27; Console.WriteLine(p2.Name + p2.Age.ToString()); } } class person { public string Name { set; get;} public int Age { set; get; } }
结构是值类型
class Program { static void Main(string[] args) { person p1 = new person(); person p2 = p1; p1.Name = "Jack"; p1.Age = 30; Console.WriteLine(p2.Name + p2.Age.ToString()); p1.Name = "Bob"; p1.Age = 27; Console.WriteLine(p2.Name + p2.Age.ToString()); } } struct person { public string Name { set; get;} public int Age { set; get; } }
引用对象与值对象的总结
1.4 ref参数与out参数
static void getPerson1(person p) { p.Name = "Amiee"; p.Age = 25; } //此版本对参数p的操作会反应到实参中 static void getPerson2(person p) { p = new person("Ray", 27); } //此版本在传参数时,参数p指向的实参对象,但是进入函数后,参数p的指向发生了变化,对p参数的操作便不会再反映到实参中
上述两个函数的阐述传递过程如下:
为解决上述问题,引入ref参数和out参数:
ref参数传入前必须初始化,out传入前不用初始化
static void getPerson3(ref person p) { p = new person("Ray", 28); } static void getPerson4(out person p) { p = new person("Ray", 29); }
均完成了对实参的修改
1.5 方法重载
具有不同返回值的同名方法可重载
具有不同参数个数、参数类型和参数顺序的同名方法
有无ref或out修饰符修饰的同名方法
1.6 静态类与静态成员
静态类的所有成员都必须的是静态的
类的静态成员可用类名直接调用
1.7 继承与多态
(1)可访问性
对internal可访问性的验证见博文https://blog.csdn.net/m1m2m3mmm/article/details/95667772
(2)继承
子类构造时,线调用父类的构造函数再调用自己的构造函数;子类对象被销毁时,先调用自己的析构函数再调用父类的析构函数
在继承时,子类的访问属性不高于父类的访问属性,比如基类是internal则不允许子类被定义为public
(3)覆盖与多态
子类会自动覆盖基类中定义的非virtual关键字修饰的同名方法,但此时直接定义子类对象,调用的是子类的同名方法;若定义指向子类的父类对象,调用的是父类的同名方法;
使用virtual关键字修饰的方法,在被指向子类的基类对象调用时,实际上调用的是子类对象的方法;直接定义子类对象时,调用的是子类自己的同名方法
(4)定义不可被继承的类
sealed class ClassName { };