运算符
- 根据运算符所需操作个数分为三类: 一元、二元、三元
- 根据执行的操作类型:
(1)算术运算符:+ - * / %
(2)比较运算符:> < = != >= <=
(3)条件运算符:表达式 ? atrue : bfalse
(4)赋值运算符:= += -= *=
(5)逻辑运算符:&& & ^ ! ||
(6)特殊运算符
装箱与拆箱
- 值类型转换为引用类型就叫做装箱
三步:
int val = 100;
Object obj; //从托管堆中对新生成的引用对象分配内存
obj = val; //将值类型的数据复制到刚刚分配的内心中
val = 456;
Console.WriteLine(“值类型:{0},引用类型:{1}”,val,obj); //返回托管中新分配对象的地址 值类型:456 引用类型:100 - 拆箱与上步骤相反:
(1)首先获取托管堆中属于值类型那部分字段的地址(装箱值),这一步是严格意义上的拆箱
(2)然后将引用对象中的值复制到位于线程堆栈上的值类型实例中
int i = 100;
Object obj = i; //隐式装箱
int j = (int)obj //拆箱
数组
声明数组的三种方式:
- int[] a = new type[num]{value1,value2};
- int[] a = new type[]{value1,value2};
- int[] a = {value1,value2};
二维数组: type[,] arrayName; 与java不同
交错数组:type[][]
.NET提供了两种数组:静态数组(数组的维度和大小是不能改变的)(System.Array类实现)、动态数组
Array类中有常用的属性和方法
复制数组常用4中方法:for语句、Copy语句、CopyTo方法以及Clone()方法
int number[]; //不能将中括号放在数组名后面
number = {1,2,3}; //{1,2,3}只能做数组的初始化,不能再给已有的数组进行赋值操作
集合
集合的概述:用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,还直接提供了各种数据结构及算法的实现,如队列、哈希表、排序等
在c#中所有集合都实现了ICollection接口,而Icollection接口继承子Ienumerable接口,所以每个内置的集合也都实现了Ienumerable接口,因此
可以使用GetEnumerator()方法返回一个枚举数,遍历集合中的内容。
C#的6种内置集合
- ArrayList集合也叫动态数组
- HashTable集合:是一种键/值对集合,它的数据是通过键和值来组织的,还可以称之为散列表或哈希表,其中HashTable集合中的元素不能
通过索引访问,所以不能通过for语句进行遍历 - Stack集合
- Queue集合
- BitArray集合
- SortedList集合
自定义集合:两种方式 - 手动执行需要的方法,比较消耗时间,而且复杂
- 从一个类中派生出集合,.NET Framework提供了一个名为CollectionBase的基类,
类
类中有:字段、属性、方法,构造方法
类中的成员变量也可以被称为字段。
属性:字段的延伸,属性有两个核心的代码块,分别时get访问器和set访问器
访问修饰符
- public internal:能在本项目中访问该对象字段
- private protect:能在子类或基类中访问
- static、 read only:只读不能写
- const与read only相似,const所定义的字段在编译时形成,read only所定义的字段在程序运行时形成
(静态方法只属于本类)静态方法:静态成员不能访问非静态成员,但是相反可以
构方法:与构造方法相反,当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构方法。析构方法往往用来做清理垃圾碎片的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构方法中将其释放)
抽象类
- 声明格式: abstract class 类名{类成员}
- 只能做父类
- 不能实例化
- 抽象类中除了抽象方法与普通方法不一样以外,其他的部分和普通类一样,即抽象类时普通类的特例。特殊之处只是有抽象方法
抽象方法 - 抽象方法是没有方法内容的,只有一个方法名和参数列表。
- 在方法的返回类型前加abstract
- 抽象方法的内容由它的继承类根据继承类自身情况去写,重写的时候把abstract替换成override
如果在普通类中定义了一个抽象方法,那么该类也是抽象类
所以抽象类不一定包含抽象方法,但含有抽象方法的一定是抽象类
继承
(子类不能继承:构造、析构、静态方法和在基类中定义的拒绝访问的成员)
定义虚方法:加上virtual关键字,这样任何派生类都可以重写虚方法,虚属性也是一样
基类中使用virtual表示派生类要继承基类,派生类可以在基类的基础上添加新功能
在派生类中使用override的作用是完全覆盖了基类,在派生类中重新定义执行的过程
隐藏方法:指子类可以使用new关键字,创建一个与基类相同的方法,这样,此方法会独立与基类的方法
调用基类使用base关键字,可以在派生类的任何地方使用base语法调用基类中的任何方法
继承抽象类:子类如果要重写基类的抽象方法,将abstract改为override,并且要重写基类所有的抽象方法,否则会出错