《Visual C# 2012 从入门到精通》学习笔记

本文档详细介绍了Visual C# 2012的学习,从编程环境设置到核心概念,如命名空间、变量、操作符、方法、作用域、异常处理、对象模型等。讲解了类、结构、枚举和数组的使用,以及继承、接口、抽象类等面向对象特性。还涵盖了LINQ查询表达式、事件处理、任务异步处理等高级主题,适合C#初学者及进阶学习。
摘要由CSDN通过智能技术生成

第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    创建数组实例

无论元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值