Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1029404
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类:

2006-01-16 14:09:33

精典摘录:
第一章
1.1 C#编译器专门用于.NET,这表示用C#编写的所有代码总是在.NET Framework中运行。对于C#语言来说,可以得出两个重要的结论:
● C#的结构和方法论反映了.NET基础方法论。
● 在许多情况下,● C#的特定语言功能取决于.NET的功能,● 或依赖于.NET基类。
由于这种依赖性,在开始使用C#编程前,了解.NET的结构和方法论就非常重要了.
 
1.2 语言互操作性的真正含义是用一种语言编写的类应能直接与用另一种语言编写的类通信。特别是:
● 用一种语言编写的类应能继承用另一种语言编写的类。
● 一个类应能包含另一个类的实例,而不管它们是使用什么语言编写的。
● 一个对象应能直接调用用其他语言编写的另一个对象的方法。
● 对象(或对象的引用)应能在方法之间传递。
● 在不同● 的语言之间调用方法时,● 应能在调试器中调试这些方法调用,● 即调试不同● 语言编写的源代码。
这是一个雄心勃勃的目标,但令人惊讶的是,.NET和中间语言已经实现了这个目标。
 
1.3 ,呵呵,自觉这一点有待商榷
C++开发人员总是很容易访问整个Windows API,而Visual Basic 6和Java开发人员只能访问其语言所能访问的基本操作系统功能。.NET基类的新增内容就是把Visual Basic和Java库的易用性和Windows API函数的丰富功能结合起来。但Windows仍有许多功能不能通过基类来使用,而需要调用API函数。在日常的使用中,会发现基类非常丰富。如果需要调用API函数,.NET提供了所谓的“平台调用”,来确保对数据类型进行正确的转换,这样无论是使用C#、C++或VB.NET进行编码,该任务都不会比直接从已有的C++代码中调用函数更困难。
 
第二章
理解了C#的用途后,就可以学习如何使用它。本章将介绍C#编程的基础知识,并假定您具备C#编程的基本知识,这是后续章节的基础。本章的主要内容如下:
● 声明变量
● 变量的初始化和作用域
● C#的预定义数据类型
● 在C#程序中使用循环和条件语句指● 定执行流
● 枚举
● 命名● 空间
● Main()方法
● 基本的命令行C#编译器选项
● 使用System.Console执行控制台I/O
● 在C#和Visual Studio .NET中使用注释功能
● C#标● 识符和关键字
● C#编程的推荐规则和约定
阅读完本章后,您就有足够的C#知识编写简单的程序了,但还不能使用继承或其他面向对象的特征。这些内容将在本书后面的几章中讨论。
 
2.1
例如:
int i; 
该语句声明int变量i。编译器不会让我们使用这个变量,除非我们用一个值初始化了该变量。但这个声明会在堆栈中给它分配4个字节,以保存其值。
2.2 变量的初始化
C#有两个方法可确保变量在使用前进行了初始化:
● 变量是类或结构中的字段.如果没有显式进行初始化,在默认状态下当创建这些变量时,其值就是0。
● 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
2.3 变量的作用域
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域有以下规则:
● 只要字段所属的类在某个作用域内,其字段(也称为成员变量)也在该作用域内(在C++、Java和 VB中也是这样)。
● 局部变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内。
● 在for、while或类似语句中声明的局部变量存在于该循环体内(C++程序员注意,这与C++的ANSI标准相同。Microsoft C++编译器的早期版本不遵守该标准,但在循环停止后这种变量仍存在)。
2.4 预定义数据类型
C#认可的基本预定义类型并没有内置于语言中,而是内置于.NET Framework中。例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。类型实际上仍存储为基本类型。基本类型在概念上用.NET结构表示,所以肯定没有性能损失。
2.5
C++的char表示一个8位字符,而C#的char包含16位。除了把char表示为字符之外,还可以用4位16进制的Unicode值(例如'\u0041'),带有数据类型转换的整数值(例如(char)65),或16进制数('\x0041')表示它们。它们还可以用转义序列表示.
 
第三章 对象和类型
3.1 结构在内存中的存储方式(类是存储在堆(heap)上的引用类型,而结构是存储在堆栈(stack)上的值类型)、访问方式和一些特征(如结构不支持继承)与类不同。较小的数据类型使用结构可提高性能。
3.2 对于类和结构,都使用关键字new来声明实例:这个关键字创建对象并对其进行初始化。在下面的例子中,类和结构的字段值都默认为0:
PhoneCustomer myCustomer = new PhoneCustomer();     //works for a class
PhoneCustomerStruct myCustomer2 = new PhoneCustomerStruct();   // works for a struct
3.3 通常,对于面向对象的语言,类成员总是实例成员,除非用static进行了显式的声明。
3.4.1方法是与某个特定类相关的函数,它们可以是实例方法,也可以是静态方法。实例方法处理类的特定实例,静态方法提供了更一般的功能,不需要实例化一个类 (例如前面的Console.WriteLine()方法)。
在C#中,每个函数都必须与一个类或结构相关。
3.4.2 注意,正式的C#术语实际上并没有区分函数和方法。在这个术语中,“函数”不仅包含方法,而且也包含类或结构的一些非数据成员。它包括索引器、运算符、构造函数和析构函数等,甚至还有属性。这些都不是数据成员,字段、常量和事件才是数据成员。
3.5.1 在C#中,所有的参数都是通过值来传递的,除非特别说明。这与C++是相同的.
3.5.2 在C#中添加ref关键字等同于在C++中使用&语法指定按引用传递参数。但是,C#在调用方法时要求使用ref关键字,使操作更明确(因此有助于防止错误)。
3.5.3 C#仍要求对传递给方法的参数进行初始化
3.5.4 编译器使用out关键字来初始化。当在方法的输入参数前面加上out关键字时,传递给该方法的变量可以不被初始值初始化。该变量通过引用被传送,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会被保留下来。在调用该方法时,还需要使用out关键字,这正如在定义该方法时一样
3.6.1 因为结构是值类型,所以new运算符与类和其他引用类型的工作方式不同。new运算符并不分配堆中的内存,而是调用相应的构造函数,根据传送给它的参数,初始化所有的字段。对于结构,可以编写下述代码:
   Dimensions point;
   point.Length = 3;
   point.Width = 6;
如果Dimensions是一个类,就会产生一个编译错误,因为Point应包含一个未初始化的引用——不指向任何地方的一个地址,所以不能给其字段设置值。但对于结构,变量声明实际上是为整个结构分配堆栈中的空间,所以就可以赋值了。
3.6.2
注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
3.6.3
此Microsoft采用一种非常简单的方式,禁止在C#中的结构内使用0参数的构造函数。
前面说过,默认构造函数把所有的字段都初始化为0,且总是隐式地给出,即使提供了其他带参数的构造函数,也是如此。也不能提供字段的初始值,以此绕过默认构造函数。下面的代码会产生编译错误:
   struct Dimensions
   {
      public double Length = 1;       // error. Initial values not allowed
      public double Width = 2;        // error. Initial values not allowed
当然,如果Dimensions声明为一个类,这段代码就不会有编译错误。

 
 
 
 
 
待续...
 
文件: 《c#高级编程(第3版)》电子书.rar
大小: 502KB
下载: 下载
此电子书DOC文件,刚502K,有的人看来可能很有哦.
 
阅读(2370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~