第1部分 Visual C#和Visual Studio2012概述
第1章 欢迎进入C#编程世界
1.1 开始在Visual Studio 2012环境中编程
1.2 编写第一个程序
1.3 使用命名空间
作为好习惯,所有类都应该在命名空间中定义。例如,Console类在System命名空间中,它的全名为System.Console
第2章 使用变量、操作符和表达式
2.1 理解语句
2.2 使用标识符
2.3 使用变量
建议变量名称以小写字母开头
2.4 使用基元数据类型
C#不允许使用未赋值的变量
2.5 使用算数操作符
2.6 变量递增和递减
如果孤立地使用递增或递减操作符,请统一使用后缀形式
2.7 声明隐士类型的局部变量
第3章 方法和作用域
3.1 创建方法
3.1.1 声明方法
声明C#方法的语法如下:
returnTypemethodName(parameterList) {
// 方法主体
}
3.1.2 从方法返回数据
3.1.3 调用方法
调用C#方法的语法如下:
result =method(argumentList);
3.2 使用作用域
3.2.1 定义局部作用域
3.2.2 定义类作用域
类定义的变量称为字段
3.2.3 重载方法
重载方法有相同的方法名,但有不同的参数数量或者/以及不同的参数类型
3.3 编写方法
3.4 使用可选参数和具名参数
3.4.1 定义可选参数
以下optMethod方法的第一个参数是必需的,因为它没有提供默认值,但第二个和第三个参数可选:
voidoptMethod(int first, double second = 0.0, string third = “Hello”) {
…
}
3.4.2 传递具名参数
要将实参作为具名参数传递,必须输入一个参数名,一个冒号,然后是要传递的值
optMethod(first:99, second: 123.45, third: “World”);
3.4.3 消除可选参数和具名参数的歧义
当重载方法的两个版本都不能完全匹配提供的实参时,编译报错
第4章 使用判断语句
4.1 声明布尔变量
4.2 使用布尔操作符
4.3 使用if语句做出判断
第5章 使用复合赋值和循环语句
5.1 使用复合赋值操作符
5.2 使用while语句
5.3 编写for语句
5.4 编写do语句
第6章 管理错误和异常
6.1 处理错误
6.2 尝试执行代码和捕捉异常
try
{
int leftHandSide =int.Parse(lhsOperand.Text);
int rightHandSide =int.Parse(rhsOperand.Text);
int answer = doCalculation(leftHandSide,rightHandSide);
result.Text = answer.ToString();
}
catch(FormatExceptionfEx)
{
// 处理异常
}
6.2.1 未处理的异常
如果异常未处理,则调用方法退出,返回上一级调用方法,以此类推,如果遍历了所有调用方法还是找不到匹配的catch处理程序,整个程序终止。
6.2.2 使用多个catch处理程序
6.2.3 捕捉多个异常
6.2.4 传播异常
6.3 使用checked和unchecked整数运算
6.3.1 编写checked语句
checked语句中的任何整数运算溢出都会引发OverflowException异常
int number =int.MaxValue;
checked
{
int willThrow = number++;
Console.WriteLine(“永远都执行不到这里”);
}
unchecked块中的所有整数运算都不检查溢出,永远不引发OverflowException异常
int number =int.MaxValue;
unchecked
{
int wontThrow = number++;
Console.WriteLine(“会执行到这里”);
}
6.3.2 编写checked表达式
int wontThrow =unchecked(int.MaxValue + 1);
int willThrow =checked(int.MaxValue + 1);
6.4 引发异常
throw语句用于引发异常对象,对象包含异常的细节
6.5 使用finally块
第2部分 理解C#对象模型
第7章 创建并管理类和对象
7.1 理解分类
7.2 封装的目的
7.3 定义并使用类
7.4 控制可访问性
private:只允许从类的内部访问,但私有仅相对于类,而非相对于对象,同一个类的两个实例能相互访问对方的私有对象,但访问不了其他类的实例中的私有数据
public:既能从类的内部访问,也能从外部访问
7.4.1 使用构造器
7.4.2 重载构造器
C#允许将类的源代码拆分到单独的文件中,但要在每个文件中使用partial关键字定义类的不同部分
partial classCircle
{
// 构造器
}
pratial classCircle
{
// 字段和方法
}
7.5 理解静态方法和数据
如果把方法或字段声明为static,就可以使用类名调用方法或访问字段
7.5.1 创建共享字段
静态字段能在类的所有对象之间共享
7.5.2 使用const关键字创建静态字段
用const关键字声明的字段称为常量字段,是一种特殊的静态字段,它的值永远不会改变
7.5.3 静态类
C#允许声明静态类,静态类只能包含静态成员
7.5.4 匿名类
匿名类是没有名字的类,创建匿名类的办法是以new关键字开头,后跟一对{},在大括号中定义想在类中包含的字段和类
varmyAnonymousObject = new {Name = “John”, Age = 47};
第8章 理解值和引用
8.1 复制值类型的变量和类
C#的大多数基元类型(包括int, float, double和char等,但不包括string)统称为值类型
类是引用类型的一个例子,引用类型容纳了对内存块的引用,C#的string关键字仅仅是System.String类的别名
8.2 理解null值和可空类型
变量应该尽量在声明时初始化
8.2.1 使用可空类型
利用C#定义的?修饰符可将变量声明为可空值类型
int? i = null;
可以将值类型变量赋给可空变量,但不能将一个可空变量赋给一个普通的值类型变量
8.2.2 理解可空类型的属性
可空类型公开了两个属性,HasValue属性指出可空类型是包含真正的值,还是包含null值,如果包含真正的值,可以利用Value属性来获取这个值
8.3 使用ref和out参数
8.3.1 创建ref参数
为参数(形参)附加ref前缀,C#编译器将生成代码传递对实参的引用,而不是传递实参的拷贝。作为ref参数传递的实参也必须附加ref前缀。
8.3.2 创建out参数
为参数(形参)附加out前缀,使参数成为实参的别名,可向其传递未初始化的实参,且在方法内部对其进行赋值
8.4 计算机内存的组织方式
操作系统和运行时通常将内存划分为堆和栈两个区域,所有值类型都在栈上创建,所有引用类型(对象)都在堆上创建,可空类型实际是引用类型,在堆上创建
8.5 System.Object类
C#提供了object关键字来作为System.Object的别名
8.6 装箱
object类型的变量能引用值类型的实例,引用过程是将数据项从栈自动复制到堆中再引用,这种将数据项从栈中自动复制到堆的行为称为装箱
8.7 拆箱
为了访问已装箱的值,必须进行强制类型转换,在object变量前添加一对圆括号,并输入类型名称
注意,装箱和拆箱都会产生较大的开销,因为它们涉及不少检查工作,而且需要分配额外的堆内存
8.8 数据类型的安全转换
8.8.1 is操作符
可以用is操作符验证对象的类型是不是自己希望的
if(o is WrappedInt) {
WrappedInt temp = (WrappedInt)o;
}
8.8.2 as操作符
“运行时”尝试将对象转换成指定类型,若转换成功,就返回转换成功的结果,若转换失败,就返回null
WrappedInt temp = o as WrappedInt;
if(temp != null) {
// 只有转换成功,这里的代码才会执行
}
第9章 使用枚举和结构创建值类型
9.1 使用枚举
9.1.1 声明枚举
定义枚举要先写一个enum关键字,后跟一对{},然后在{}内添加一组符号,这些符号标识了该枚举类型可以拥有的合法的值
enum Season { Spring, Summer, Fall, Winter }
9.1.2 使用枚举
声明好枚举之后,可以像使用其他任何类型那样使用它们
Season colorful = Season.Fall;
9.1.3 选择枚举文字常量值
可以获取枚举变量的基础整数值
Console.WriteLine((int)colorful); // 输出’2’
可以将特定整数常量和枚举类型的文字常量手动关联起来
enum Season { Spring = 1,Sumer, Fall, Winter }
多个枚举文字常量可以拥有相同的基础值
enum Season { Spring, Summer, Fall, Autumn = Fall, Winter }
9.1.4 选择枚举的基本类型
声明枚举时,枚举的文字常量将获得int类型的值,但是,也可以让枚举类型基于不同的基本整数类型。
enum Season : Short { Spring, Summer, Fall, Winter }
9.2 使用结构
结构是值类型,在栈上存储,所以能有效地减少内存管理的开销。结构可以包含自己的字段、方法和构造器
在C#中,基元数值类型int, long和float分别是System.Int32, System.Int64和System.Single这三个结构类型的别名
9.2.1 声明结构
声明结构要以struct关键字开头,后跟类型名称,最后是大括号中的结构主体
struct Time
{
public int hours, minutes, seconds;
}
9.2.2 理解结构和类的区别
l 不能为结构声明默认构造器,自己写的构造器必须显示初始化所有字段
l 类的实例字段可以在声明时初始化,但结构不允许
9.2.3 声明结构变量
定义了一个结构类型之后,可以像使用其他任何类型那样使用它们
9.2.4 理解结构的初始化
结构的所有字段都在栈上创建
9.2.5 复制结构变量
可将结构变量初始化或赋值为另一个结构变量,前提是操作符=右侧的结构变量已完全初始化(即所有字段都已初始化)
第10章 使用数组
数组是引用类型,是System.Array类的实例
10.1 声明和创建数组
10.1.1 声明数组变量
声明数组变量要先写它的元素类型名称,后跟一对方括号,最后写变量名
int[] pins;
10.1.2 创建数组实例
无论元