主要包含C#常用语句、语言特征、面向对象编程基础、集合和索引。
C#常用语句
-
注释语句
- // 单行注释
- /* … */ 多行注释
- /// xml注释
-
if、switch、for、while、do while
-
foreach
- 与for语句类似,都是重复执行指定的一组语句。但foreach语句专门用于遍历数组或对象集合中的每个元素。
- 语法格式:
foreach (数据类型符 变量名 in 数组或集合)
{
循环体
}
-
迭代器
- 迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接口,那么就能够被迭代;调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似数据库中的游标,他是数据序列中的一个位置记录。迭代器只能向前移动,同一数据序列中可以有多个迭代器同时对数据进行操作;
- C# 2.0 后通过yield return语句简化迭代器的实现;
-
try语句,异常保护语句
Try
[〈try语句块〉]
[ Catch
[〈catch语句块〉] ]
[Finally
[〈finally语句块〉] ]
####语言特征 -
泛型:
- 泛型栈的定义
Public class Stack
{
T[] m_items;
public void Push(T item)
{ … }
public T Pop()
{ … }
} - 栈的使用
Stack stack=new Stack();
stack.Push(1);
Int number=stack.Pop(); - 特征:内部算法和数据操作保持不变,而实际数据类型可以在使用时指定
- 优点:支持任何类型(包括自定义);减少代码冗余;类型安全;性能提高(值类型提高200%,引用类型提高100%)
- 泛型栈的定义
-
可空类型
- 是System.Nullable结构类型的实例
- 可空类型可以表示其基础值类型正常范围内的值,再加上一个null值
- System.Nullable结构:
public bool HasValue { get; }
获取一个值,指示当前的确对象是否有值;
public T Value { get; }
获取当前的确System.Nullable值;
public T GetValueOrDefault()
检索当前System.Nullable对象的值,或该对象的默认值;
-
分部类
- 定义:
partial class Stack
{
object[] m_items;
public void Push(object item) { …}
}
partial class Stack
{
public object Pop()
{ …}
} - 应用范围:大型项目开发;Windows Form/Web Form等
- 规定:所有部分都必须使用partial关键字;各个部分必须具有相同的可访问性;各个部分可以指定不同的基接口,最终类型实现所有分部声明所列出的全部接口。
- 定义:
-
反射
- 用途:在程序或装配件中查找有关类型的信息,或者从装配件中读取元数据。反射包含的大多数类都在System.Reflection命名空间中。
- 常用:
- Type类:查找有关类型的相关信息。
获取指向给定类型的Type对象有2种常用方式
(1)Type t =typeof(double);
(2)Type t = Type.GetType(“System.Double”)。 - Assembly类:在System.Reflection命名空间中定义,它允许程序员访问给定装配件的元数据。
-
Lambda表达式
- 介绍:简化委托的代码编写形式,当函数语句少且需使用委托时较方便,代码更简洁高效。
- 基本用法:
Lambda表达式是一个可用于创建委托或表达式树类型的匿名函数。
语法为 (输入参数列表)=>{表达式或语句块}
Lambda运算符(=>)来描述,读作“goes to”。 - 示例:
- x=>xx //输入参数为x,返回xx
- (x,y)=> x == y //输入参数为x和y,返回布尔值
- ()=SomeMethod() //无参数,返回函数值
-
自动属性
- C#编译器遇上空的get/set属性的话,它会自动在类中生成一个私有成员变量,对这个变量实现一个公开的getter 和setter。
- eg.
- public string FirstName { get; set; }
- public string LastName { get; set; }
-
互操作
- 由CLR管理的托管代码与非托管代码之间的交互操作
- 互操作性三种方式:
- 在.NET应用程序中使用COM对象;
- 在COM客户程序中使用.NET组件;
- 调用本地方法的Platform Invoke(平台调用);
using System.Runtime.InteropServices;
[DllImport(“user32.dll”)] static extern int
MessageBoxA(int hWnd, string msg, string caption, int type );
-
正则表达式
- 定义:用某种模式去匹配指定字符串的一种表达方式
- 由普通字符和元字符组成
- 普通字符:字母、数字、汉字等;
- 元字符:可以匹配某些字符形式的具有特殊含义的字符,其作用类似于DOS命令使用的通配符。
- 使用示例:
- Regux类, 表示不可变(只读)正则表达式类。
- Match类, 表示正则表达式下一个匹配的结果(只读)
- MatchCollection类, 成功的非重叠匹配的集合(只读)
- Group类, 匹配子字符串有多组时,单个捕获组的结果
Regex r = new Regex(“abc”);
MatchCollection mc = r.Matches(“123abc4abcd”);
int count = mc.Count;
String[] results = new String[count];
int[] matchPosition = new int[count];
for (int i = 0; i < count; i++)
{
results[i] = mc[i].Value;
matchPosition[i] = mc[i].Index;
Console.WriteLine(“第{0}个匹配结果:{1},位置:{2}”,i+1, results[i], matchPosition[i]);
}
####面向对象编程基础
- 类:类是对所有具有共同特征的事物的抽象,是一个抽象的概念。类可以视为是一个具有类似特征与共同行为的对象的“模板”。这个模板通过定义属性来存储数据,通过定义操作来使用这些数据,类同时也定义了一套规则来允许或禁止访问它的属性和操作。
- 对象:面向对象技术是基于对象概念的,一个面向对象的程序的每一个成分都是对象。程序是通过对象的建立及对象之间的通信来执行的。
对象是一个属性集合及其操作的封装体。每个对象都有属性和方法。 - 每个对象都包含一组数据,用来描述对象的特征。这组描述对象特征的数据称为对象的属性。它描述了对象的状态和特征,可以是系统或用户定义的数据类型,也可以是一个抽象的数据类型。属性一般只能通过执行对象的操作(方法)来改变。对象属性值的集合称为对象的状态。eg. form1.Text
- 对象的事件,事件是对象能够识别的动作,也就是对象上所发生的事情。如,汽车(对象)正在行驶时踩刹车(事件),汽车将停车(对象对事件的响应,也就是事件导致的结果)。C#.NET中,事件是预先定义好的能够被对象所识别的动作,是导致执行某过程的通知。对每个对象来说,事件的类型是固定的,用户不能改变。但对事件的具体响应是可以自行设计的。eg.按钮控件的Click事件,窗体的Close事件。
- 对象的方法,是指对象的行为方式,是指定义在对象属性上的一组操作方法的集合,说明了对象的行为和功能,即对象要执行的功能。方法又称为操作或服务,也称为行为。是为响应消息而完成的算法,表示对象内部实现的细节。对象的方法集合体现了对象的行为能力。eg.textBox1.Clear();文本框清空,button1.Focus();按钮获得焦点
- 类的三大特性:
- 封装性,指将不同功能和属性包装、捆绑在一个抽象的实体中,并隐藏其内部的复杂性。sealed可声明密封类。
- 继承性:派生类只能从一个类中继承,即单继承。派生类继承基类的成员,但不能继承基类构造函数。类的继承可以传递。
- 多态性:指相同类型实体的不同派生实体的实例可用同一个名称来指定,并共享特性。可使对象适应外部的变化。为了在派生类中更改基类的数据和行为,可以:
- 使用new关键字重新定义类的成员
- 使用virtual和override定义类成员
- 调用基类的方法,使用base关键字
- 构造函数:public,与类名相同,无返回类型
- readonly字段,运行时可赋值一次,const字段编译时确定值
- 对象生命周期:
- 使用new运算符创建对象并要求获得内存;
- 对象初始化,包括对象的数据成员的初始化;
- 使用对象,包括访问对象的数据成员、调用对象的方法成员;
- 对象释放前释放对象所占用的资源,如关闭磁盘文件、网络连接等;
- 释放对象,回收内存(垃圾回收器自动完成)。
- 其中,第2阶段可通过调用对象的构造函数来完成,第4阶段可通过析构函数来完成。
- 析构函数特点:
- 不能在结构中定义析构函数,只能对类使用析构函数;
- 一个类只能有一个析构函数;
- 无法继承或重载析构函数;
- 析构函数既没有修饰符,也没有参数;
- 在析构函数被调用时,.NET的公共语言运行时自动添加对基类Object.Finalize方法的调用,以清理现场,因此在析构函数中不能包含对Object.Finalize方法的调用。
- 在默认情况下,编译器自动生成空的析构函数,因此C#不允许定义空的析构函数。其实析构函数性能较差,并不推荐使用,如果需要尽快关闭和释放所占用的资源,应实现一个强制回收方法,一般称为Close()或Dispose()。
####高级程序设计
-
静态
- 静态成员通过static关键字来标识,可以是静态方法、字段、属性或事件。静态成员与非静态成员的不同在于:静态成员属于类,而不属于类的实例,因此需要通过类而不是通过类的实例来访问;而非静态成员则总是与特定的实例(对象)相联系。
- 静态类使用static关键字来声明指示它仅包含静态成员,不能使用new关键字创建静态类的实例。在实际应用中,当类中的成员不与特定对象关联的时候,就可以把它创建为静态类。
- 静态类有下以特点:
- 静态类仅包含静态成员;
- 静态类不能被实例化;
- 静态类是密封的;
- 静态类不能包含实例构造函数;
-
多态
-
抽象类
-
接口
- 多重接口实现,C#不允许多重类继承,但C#允许多重接口实现,定义时基类必须在接口之前,如:
public class Mobile :
Phone,IUsb, Ibluetooth
Public class Mp3:IUsb - 访问接口的方法
Mp3 m = new Mp3();
lblShow.Text=m.TransData(“计算机”,“MP3设备”);
或者
Mp3 m = new Mp3();
IUsb iu = (IUsb)m;
lblShow.Text = iu.TransData(“计算机”, “MP3设备”);
####集合和索引
-
集合:
- 是通过高度结构化的方式存储任意对象的类。
- 集合不仅能随意调整大小,而且对存储或检索存储在其中的对象提供了更多的方法。集合可以把一组类似的对象组合在一起。
- 对象类型的集合位于System.Collections命名空间;集合类的功能是通过实现System.Collections命名空间中的接口而获得的。
- .NET Framework提供的常用集合包括数组、列表、哈希表、字典、队列和堆栈等基本类型,还包括有序列表、双向链表和有序字典等派生集合类型。
- .NET Framework也提供了一些专用集合用于处理特定的元素类型。
- StringCollection是字符串集合,由若干个字符串组成。字符串集合与字符串数组的区别在于,字符串集合提供了大量的可直接调用的方法,包括Add(添加)、 Clear(清空)、Contains(是否包含特定字符串)、IndexOf(搜索特定字符串)、Insert(插入)和Remove(移除特定字符串)等。
-
ArrayList
- ArrayList是一个可动态维护长度的集合,它不限制元素的个数和数据类型,可以把任意类型的数据保存到ArrayList集合中。
- 数组类Array与动态数组类ArrayList的区别:
- Array的大小固定,ArrayList可根据需要自动扩充;
- 在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;
- Array的下限可自定义,ArrayList的下限始终为零;
- Array可具有多个维度, ArrayList始终只是一维的;
- Array 位于System命名空间中,ArrayList 位于System.Collections 命名空间中。
- 用法示例:
- void Remove( Object obj) //删除指定对象名的对象
- void RemoveAt(int index) //删除指定索引的对象
- void Insert( int index, Object value) //在指定位置插入对象
- void Clear() //清除集合内的所有元素
- (类型) ArrayList[index] //按指定索引(下标)取得对象
- ArrayList.Add(obj);
- Arraylist.Count 获得成员数
- foreach(obj one in arraylist){…}
-
其他
- Hashtable索引器
Hashtable htBooks=new Hashtable();
Book bk=new Book(bookID,bookTitle,bookPrice);
htBooks.Add(bookId,bk); - Stack栈
Stack stack = new Stack();
stack.Push(“往上打”);
stack.Pop(); - Queue队列
Queue queue = new Queue([队列长度][, 增长因子]);
Queue queue = new Queue(20, 3.0f);
Enqueue入队列,Dequeue方法出队列
- Hashtable索引器
-
索引器
C#中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。
-
泛型
.NET Framework在System.Collections.Generic和System.Collections.ObjectMode命名空间中就提供了泛型集合类,如List、Queue、Stack、Dictionary等,它们都有增加、删除、清除、排序和返回集合元素值的操作方法,并写适用于任意类型的数据。- List列表,是ArrayList的泛型等效类
List listBooks=new
List();
listBooks.Add(bk); - Stack 泛型栈
- Queue泛型队列
- Dictionary<K,V> 泛型字典
- HashSet哈希集,HashSet类提供高性能的集运算。集合是一组不重复出现且无特定顺序的元素;HashSet对象的容量是该对象可容纳的元素个数。并且其容量将随该对象中元素的添加而自动增大;
HashSet intHashset=new HashSet();
intHashSet.Add(aInt);
- List列表,是ArrayList的泛型等效类
-
泛型类
- 当一个类的操作不针对特定或具体的数据类型时,可把这个类声明为泛型类。泛型类最常用于集合。
Person<int,string> super=new Person<int,string>(7,”James”);
- 当一个类的操作不针对特定或具体的数据类型时,可把这个类声明为泛型类。泛型类最常用于集合。