C#学习参考笔记(C#学习指南)
软件开发过程
(1) 软件规范─定义软件的需求。也就是需要知道软件的具体功能是什么。
(2) 软件设计─将软件规范变成一个可操作程序的想法或方案。它将软件规范与高级语言(如C#)的实际程序文本编写联系起来。
A. 将整个项目细分为不同的子系统─子系统的例子有:用户界面、报表格式及数据库接口。
B. 将每个子系统隔离成不同的模块─这里,模块指数据及作用于数据的程序的集合。一个程序(指子程序)包含一套依次执行的指令集。在C#世界,子程序指一个方法。
C. 在每个模块中确定数据及其方法─模块所提供的服务可分成适当的子部分,每个子部分足以由一个方法来完成。每个子部分将指定一种方法,所以,每种方法可以由此指定其功能。最后,设计者要确定此模块将代表的数据。
D. 内部方法设计─这一设计工作通常留给单个程序员去做。要完成指定的任务就必须构建适当的算法。
(3) 编写软件─构建和编写文本,它将生成程序的源代码。C#编写的实际语句。这一部分设计过程通常需要由项目的大小和性质决定。
(4) 软件验证和调试─软件必须通过验证,以确保它的功能与软件规范阶段所定义功能一致。
在程序编写期间和完成后必须对程序进行多种测试,这是为了确保程序与预期的功能一致。实际上就是寻找程序中的错误。这一活动称为测试。
3个不同的错误类型:
1. 语法错误─指C#源代码中的语法错误。
2. 逻辑错误─伪码在逻辑上出现的错误,就称为逻辑错误。
3. 运行时错误─如果在执行程序时发现并报告了一个错误信息,我们就将此类错误称为运行时错误。
类的基本概念初认识:
一个类定义了一组相似对象的共性(实例变量和方法)。所以,同一个类的所有对象有相同的实例变量和方法。每个实例变量的内容可以随对象的不同而不同,但类定义的方法在所有该类对象中都是相同的。
软件重用:
软件重用可以分几种情况,下面是其中的两种情形:
1.重用单个代码行 这是一种简单的重用形式,它只是将代码行从程序的一个部分复制到另一个部分。
2.以类作为重用单元 类是一个极好的重用单元。.NET中代码重用的基本单元:集合
面向组件编程:
不仅包括面向对象编程,还集成了代码重用的机制。要理解由。NET提供的这一机制来实现面向组件编程,我们首先需要看一看类和代码重用的本质。
(1) 类通常相互协作─一个类中的对象通常与其他类中的对象相互协作来完成某个任务。
(2) 类的种类─通常可以说一个类与另一个类属于同一个种类。例如,一个类可用来计算数的平方根并提供不同的对数函数。另一个类可以用于计算三角函数表达式。两个类就可以认为同属于数学类。
(3) 类库─将同一类别的类收集起来装入同一个容器使之更容易浏览使用。这种类的集合通常叫做类库。
(4) 类和资源─类和类库通常依赖于不同的资源。这些资源不能看作计算机程序。如图像和声音就属于资源。
(5) 类和文件─类和类库存在于计算机中,所以必须具备物理形态(计算机存储器和处理器中的电子信号)。它们通常以文件形式静态保存。当类被激活并使用它的功能时,它们就在主存储器和处理器中被编译和执行。
集合是一个逻辑性自描述性包。它包含MSIL、元数据和可选资源。如图形图像。在.NET下编写的任何程序,不管它是一个重用的组件还是一个独立的运行程序,它都是一个集合。
C#的设计目标
1. 让C和C++程序员熟悉C#
2. 比C++更简单、更安全、更高产
3. 真正的面向组件语言
4. 真正的OOP语言,与SmallTalk一样,一切都是对象
5. 与Visual Basic相似,实现对RAD的全面支持
6. 与.NET平台的完全集成
7. 在面向对象级与其他语言协调工作
8. 与现有代码(如COM和DLL)完全协同工作
语法错误与编译器的注释:
1. 编译器所执行错误信息中的行数不总是正确的
2. 若干编译错误可能产生于一个真正的错误
3. 编译信息通常需要进一步的解释
4. 在编译时暂时隐藏部分源代码
封装:是一个将数据和作用于数据的动作(方法)组合成单个实体的过程,在OOP中,这一实体就等价于对象。封装是一种相对其他对象隐藏其实例变量及类相关方法的机制。只有方法能被访问,它是使用类的对象所必须的。封装提供了一个与外部世界通信的层。只有通过此层外部世界才能与此对象通信。它还允许在层中隐藏其他部分内容。这一保护层就是一个接口,它只能包含方法。Private方法仅能由属于同一个对象的方法调用。它们对对象中的其他方法(通常是Public)提供功能和支持,这通常称为帮助方法或实用方法。
封装的优点主要有:
1. 它提供了一个抽象层─封装让使用此类的程序员不必了解实现此类的详细细节。
2. 它分离了对象的用户接口与其功能─它可以升级对象的功能而保持原有的用户接口。
3. 它使用一个保护包装器来维护此对象─封装保护对象的内部数据不被非法访问,避免了数据的崩溃和误用。
Main()方法及其定义:
任何C#程序都从Main()方法执行。当程序开始执行时被.NET运行时调用。Main()方法总是必须声明为Public和Static。
方法调用的一般原理:
1. 对一个对象内非静态方法的调用的一般语法如下:
ObjectName。MethodName(Optional_Arguments)
2. 包含类名时,对静态方法的调用语法如下:
ClassName。MethodName(Optional_Arguments)
消息:方法调用的另一个术语
当对象A的一个方法中包含一条调用对象B的方法时,我们就称A向B发送消息。
一般而言,类代表对象,而方法代表动作。
当你给类和方法命名时,尽量遵循以下原则:
给类命名时使用名词(如Car,Airplane等等)
给方法命名时使用动词(如Moveleft,Takeoff等等)
return所属语句类型称为返回语句。当执行返回语句时,方法终止。程序流返回到调用体并携带return后表达式的值。Void方法不返回数据。
使用注释语句来描述源代码的整个意图而不是仅仅重复说明代码的作用。
一个包含整数数字的string值可以转换成int类型值。相反,int类型值也可以转换成string类型值。
C#使用了几种大小写样式:
1. Pascal样式─名字中的每个单词的第一个字母大写。
2. Camel样式─与Pascal样式相同,不同的是标识符的第一个单词首字母小写。
建议命名类和方法时使用Pascal样式,命名变量时使用Camel样式。
分隔符:用于将不同的元素分割开。
花括号{} 用于限制类、方法以及分支和循环语句代码块的范围。
圆括号() 在方法头中包含形式参数列表、在方法调用语句中包含参数列表。对于if语句及分支和循环语句,还用于包含布尔表达式。
分号; 结束一条语句。
逗号, 分割方法头中圆括号内的形式参数、分割方法调用语句中的参数。
句点. 用于引用包含在其他名字空间中的名字空间、在名字空间中指定类、在类和方法中指定方法(如果可以访问的话)。也可以用于在类和对象中指定实例变量(如果可以访问的话),但在实际应用中应避免。
当一个变量在参与计算前赋予一个值时,我们就说它被初始化了。初始化变量有两个重要的方法。它们是:
1. 在声明中为变量指定一个初始值。
2. 利用C#中的构造函数。当创建某个类的一个对象时,包含在构造函数中的源代码被执行,这是初始化变量的理想时间。构造函数是暂时存在的。
声明一个代表某个类的对象的变量:修饰符 类名 变量名。意思是该变量是一个声明用于表示对该类一个对象的引用的变量。
要指定一个方法是一个构造函数,它必须与它的类同名。无论何时用new关键字创建一个新的对象时,自动调用构造函数来执行所需的初始化。当调用任何方法、构造函数时,括号是必须的。
类关系和统一模型语言(UML)
用其他类来构建一个类的方法通常叫做聚集。相应的关系叫聚集关系。如果聚集关系反映了一个类是另一个类的一个有机部分,我们还可以进一步将此类聚集称为复合。
无论何时,在一个赋值语句中给一个变量赋值时,编译器将检查变量类型与所赋予值类型的兼容性。如果不兼容,它就会提示一个错误信息。
在调用方法时,给形式参数传递参数是另一个可能导致类型冲突的地方。
隐式转换是一种由C#编译器自动将一种类型转换成另一种类型的方式。
一个值类型的变量保存对应的实际值。引用变量包含了一个对计算机存储器中对象的引用,它本身并不包含此对象。引用包括指向对象的位置(或地址)。
指向保存于计算机存储器中对象的存储器地址称为指向此对象。
源值可能超过了最终类型的上限,这称为溢出(overflow)。如果源值小于最终类型的下限,就会导致下溢(underflow)。
代表常数的名字叫常量。
常量声明可以放在类定义中,使之成为类的一个成员。这里的常量总是静态的,所以类外部的其他对象只能通过类名来访问,不能通过实例化对象名来访问。
使用常量的优点:
1. 理解一个值的意义─常量能让程序的阅读者对数字所代表的意义有更好的理解。它能使程序具有自解释性。
2. 需要修改时,只需要更改一个地方─一些常量可能在整个源代码中被使用了无数次。通过在程序中使用一个常量名,你仅仅需要修改一个地方的值。
要增加源代码的清晰度和自解释能力,避免使用深度嵌套表达式。相反,如果需要,使用临时变量和更多的语句来表达。使用括号来让程序清楚,即使有时它们不需要也要如此。
基于表达式元素及其上下文来判断表达式类型的规则叫类型推论规则。
当创建一个string对象后,它所代表的字符集不能修改。因此,字符串是永恒的。基于此原因,没有一个string方法可以修改已有的字符串;相反,它们只能修改和返回一个新的字符串。例如:mytext=mytext.ToUpper();
变量的作用域
1.作用域是一个与块结构紧密相连的重要概念,作用域决定了哪一个源代码片断(在这里是变量)对源代码的其他部分是可见的(在这里指可访问)。作用域是一段可使用某特定变量标识符的源码片断。变量只能在它的作用域内使用。声明变量的所在源代码块定义了此变量的作用域。C#中两个主要的作用域是用类块和方法块的代码部分。
2.当一个块B插入另一个块A中后,由块B形成的作用域叫内部作用域,由块A形成的作用域叫外部作用域。内部和外部是相对而言的。
3.本地变量是在某个方法内声明的变量。在某个方法块内声明的变量是不能从此块的外部访问的,所以称为本地变量。
4.根据经验,在一个块内声明的变量仅能在此变量被声明后,在本块中进行访问(包括插入到此块中的其他块)。一个变量可以在块的任何地方声明。
5.在内部作用域内声明变量且此变量名与外部作用域中的某变量名同名是错误的。因为这样一来,将会赋予外部作用域变量不同的意义。
6.另一方面,在位于同一块中的两个块中声明两个同名变量尽管容易混淆但却是可行的,但这两个块只能相邻不能相互嵌套。
变量的生存期是在创建和删除此变量中的一段时间。从创建变量开始,它的值就保存在计算机存储器的某个地方。变量的保存直到删除它时才会取消。从一个变量名对存储器中数据的引用通常称作绑缚。
一般规则是,C#中的变量创建于程序进入它的作用域之时,消亡于离开作用域之时。所以,变量的生存期限制于它的作用域之中。