第一部分:OOP
一. 变量与表达式
1.值类型:
//(1)整数类型:
sbyte、byte、short、ushort(unsigned)、int、uint、long、ulong //signed:有正负之分的
//(2)浮点类型:
float、double、decimal
//(3)文本和布尔类型:
bool、char //一个Unicode字符,存储0—65535之间的整数
//(4)结构类型:
struct //point、size、datetime
//(5)枚举类型
enum
2.引用类型:
//(1)类类型:
class /string为字符串类
//(2)接口类型:
interface:
(3)委托类型:
delegate
//(4)数组类型:
array
3. 运算符
// 优先级从高到低
(1)++、-- (用作前缀)、+、- (一元)
(2)* 、/、%
(3)+、-
(4)=、*=、/=、%=、+=、-=
(5)++、-- (用作后缀)
!& | ++ -- > 算术运算符 > 关系运算符 > && > || (逻辑运算符)> 赋值运算符
4.数组
(1)声明一维数组:(三段代码效果一致),例:
//数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,
//其中的每个元素也被按照成员变量同样的方式隐式初始化(数值类型是0;引用类型是null)
int[] a = new int[3];
a[0] = 3;
a[1] = 5;
a[2] = 9;
int[] a = {3,5,9 };
int[] a = new int[] { 3, 5, 9 };
(2)foreach循环
foreach (< baseType > < name > in < array >)
{
body_statement;
}
注意:foreach是只读式遍历
(3).声明二维数组,如下:
int[,] a = {{1,5,9},{2,5,9},{3,5,9}};
getlength()方法的使用:如下:
//获取各个维度的长度
a.GetLength(0),a.GetLength(1)
二.流程控制
1.switch:
// 不能随便贯穿,必须有break;除非几个case连起来,中间没有别的语句
switch (exp)
{
case const1:
statement1;
break;
case const2:
statement2;
break;
......
case constN:
statementN;
break;
default:
statementN_default;
break;
}
2.for:
// 包含:初始化部分、循环条件部分、迭代部分、循环体部分
for(init_statement;test_exp;alert_statement)
{
body_statement
}
3.while:
// 包含:初始化部分、循环条件部分、循环体部分、迭代部分
// 当循环不是特别规则的时候,大多选用while
[init_statement]
while(test_exp)
{
body_statement;
[alter_statement;]
}
4.循环的中断
break //立即终止循环
continue //立即终止当前的循环(继续执行下一次循环)
return //跳出循环及包含该循环的函数
三、类
写程序就是写类
1.字段、方法
写类就是写变量和函数,而字段就是变量,方法就是函数
构造方法(constructor):构造方法的主要作用是完成对象的初始化
(1)构造方法的方法名与类名相同
(2)构造方法没有返回类型,也不能写void
初始化最常见的任务就是把带进来的参数赋值到字段里面去,例:
public Person(string n,int a)
{
name=n;
age=a;
}
默认构造方法:如果用户没有定义任何构造方法,则系统会自动产生一个publlic Person(){}
析构方法:由于C#自动进行对象的释放,所以用户一般不定义析构方法
this:指这个对象本身,常用于:
(1)访问这个对象的字段和方法
(2)区分字段和局部变量
(3)用于构造方法调用另一个构造方法,注意其位置,例:
public Person():this(0,"")()
{
// 构造方法的其他语句;
}
2.属性(property)、索引(indexer)
对字段和方法的扩充
属性的书写:
private string _name;
public string Name
{
get{return _name;}
set{_name = value;} // value表示传进来的参数
}
//可简写为
public string Name { set; get; }
对属性进行访问:
Person p = new Person();
p.Name= "Li Ning"; //set
console.WriteLine(p.Name); //get
属性与字段的比较:
(1)属性可以只读(只有get)或者只写(只有set)
(2)属性可以进行有效性检查:if…
(3)属性可以计算得到的数据:
public string Info
{
get{ return "Name:" + Name + ",Age:" + Age; }
}
(4)可以定义抽象属性
索引的定义:
修饰符 类型名 this[参数列表]
{
set{ }
get{ }
}
3.类的继承:
C#采用单继承,所
有的类都直接或者间接的继承至object类
除了继承父类的成员外,子类还可以:添加新的成员,隐藏或修改父类的成员
字段隐藏:
class A
{
public int a;
}
class B:A
{
new public int a; //new
}
与父类同名的方法:
(1)定义同名、但参数列表与父类不用的方法,这称为对父类方法的重载(overloading)
(2)定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用new表示
(3)定义同名且参数列表也与父类相同的方法,而且父类的方法用了abstract或virtual进行了修饰,子类的同名方法用了override进行了修饰,这称为虚方法的覆盖(overriding)
base
(1)修改父类方法的同时,又利用了父类的方法:
void sayHello()
{
base.sayHello();
console.WriteLine("My school is:"+ school);
}
(2)定义构造方法的同时,调用父类的构造方法,最后再增加一些信息:
Student(string name,int age,string school)
{
this.school=school;
}
as运算符:常用于父类与子类的转换:
Student s3 = p1 as Student;//被如果能转换,s3被赋值;如果不能转换,s3的值为null
注意:as只能应用于引用类型,与强制类型转换有区别
is运算符:判断一个对象是不是某个类(及其子类)的实例:
if(p is Person)
4.修饰符
访问修饰符:public、private、internal、protected
static(静态的)
static的字段、方法、属性是属于整个类的,而不是某一个实例的。所以不能使用this…(与this相对)
static变量可以用来表示"全局变量"
const与readonly
const相当于静态常量,如Math.PI
readonly相当与不可改量,只能赋一次值,如String.Empty。在构造方法中赋值,或者在声明时就赋值。
注意:const只能用于基本及string
readonly只能修饰字段,而const还可以修饰局部变量
sealed与abstra
sealed类,不可继承
abstract类,不可实例化
5.接口(interface)
:帮助实现多重继承
(1)定义一个接口:接口是一系列方法
public interface IStringList
{
void Add(string s);//普通的方法
int Cout{get;}//比较特殊的方式;属性
string this [int index]{get;set;}//比较特殊的方式:索引器
}
注意:public abstract 这两个关键字不写出来
(2)实现接口:
class 类名:[父类] ,接口,接口,接口
{
public 方法()
{
//定义的时候没有实现,现在将它具体实现
}
6.结构和枚举
(1)struct:值类型
每个字段在定义时,不能给初始值
构造方法中,必须给每个字段进行赋值
是sealed的,是不能被继承
struct Point
{
public double x,y;
public Point(int x,int y)
{
this.x=x;
this.y=y;
}
public double R()
{
return Math.Sqrt(x*x+y*y);
}
}
(2)枚举:本质是有意义的整数:
enum MyColor //后面可以跟一个 :int
{
Red,
Green=1,
Blue=2
}
赋值与比较:如下:
MyColor c=MyColor.Red;
if(c==MyColor.Red)
switch(c){case MyColor.Red:*********}
与字符串的转换:如下:
Console.WriteLine(c.ToString()); //转成红绿蓝
c=(MyColor )Enum.Parse(typeof(MyColor),"Red");
四、C#高级特性
1.委托:
大体上相当于函数指针,但它类型更安全,是引用类型
C#定义了很多的委托:
Action<T1,T2>
Func<T1,T2,Tresult>; //new Func<double,double>(Math.Sin);
委托具有多播的功能:使用运算符±,+=,-=,可以动态地增减其中的函数,提高了程序的灵活性
2.事件:
大致上相当于回调函数,事件的类型是一个委托
事件的声明:public event 委托名 事件名;
事件的注册与移除:事件名+=或-=(在事件所在类的外面,只能用以上两个运算符)
事件的发生(激发):事件名(参数列表)
3.lamda表达式:
4.运算符重载:
5.异常处理:
try{......}
catch(Exception e1){......}
catch(Exception e2){......}
catch(最一般的Exception e){}
finally{......} //无论怎么样都会走到这里来,甚至包括try里面有return
五、基础类及常用算法
1.类型转换
任何事物都是object类的子类,任何对象都有一下方法:ToString()、 Equals(), GetType()、 MemberwiseClone()等
类型转换函数:System.Convert、 int.Parse(string)、 int.TryParse(string)
2.几个常用类
数字、文字、日期
(1)Math类:提供了相关的数学方法
Abs() //绝对值
Sin()、 Cos()、 Tan()
Round() //四舍五入
Exp()、 log() //对数指数
Pow() //乘方
(2)Random类:得到的都是伪随机数
.Next(100) //0到100之间,不含100
.NextDouble() //0到1之间
(3)DateTime:是值类型
new DateTime(y,m,d,h,m,s)
.Now
.ToString(“yyyy-MM-dd HH:mm:ss”)
.AddMinute(5)
.Year、 .Month、 .Day、 .Date
TimeSpan //两个日期相减,可以得到一个TimeSpan
(4)String类:
==(内容是否相等)、 +(连接)、 [];
.Lenth() 长度、 .Indexof()取下标 、 .LastIndexof() 反向去查找;
.StartWith() 使…开始、 .EndsWith;
.Substring(idx,len)求字符串,注意第二个参数;
.Trim()去空格 、 .TrimEnd()去掉末尾空格 、 .PadLeft() 左边填充空格、 .Insert () 、 .Remove();
.Split(’;’)分割 、 string.Join可以把字符串连接起来;
(5)String及StringBuilder
String //内容不可变
StringBuilder //内容可变:.Append、 .Remove 、 .Replace 、 .Length 、 .ToString
3.数组、集合、泛型
(1)数组:控制长度,控制类型
(2)集合:不控制长度,不控制类型
//System.Collections命名空间;
Arraylist //相当于动态数组,实现IList;
Hashtable //相当于键/值的集合,实现IDictonary; 用[]进行访问,表示获取、增加、删除、修改; 用于查询时,比线性搜索效率更高,可用于程序的优化;
Stack和Queue
(3)泛型:不控制长度,控制类型
// 具有更好的类型检查和性能;
//System.Collections.Generic名称空间;
//列表:
List/LinkedList SortedList //List的Add方法,Count属性,[i]索引器;foreach的遍历;
//字典:
Dictionary SortedDictionary;
//集:
HashSet SortedSet //Hashtable的[]索引,可以表示获取/加入/修改/删除(置为null);foreach的遍历;
Stack,Queue;
(4)使用foreach访问数组和集合
4.常用算法:遍试、迭代、递归