Web开发之C#:(2)C#语言及语法
参考书籍:
在介绍C#语言前,先推荐两本书 :Jeffrey Richer (美)的《CLR via C# (第4版)》和Jon Skeet(英)的《深入理解C#(第3版)》。
CLR via C#(第4版)
包括C#所有数据类型设计的详细剖析、.Net异常、内存管理、程序集、序列化等核心机制以及线程处理的深入讲解。深入、全面。适合中高级开发人员阅读,既能巩固C#编程,又能全方位学习.Net Framework、CLR知识。
深入理解C#(第3版)
C#1到C#5所有版本的语言特性最详细的剖析,包含所有C#语言中最基础和最高级的知识。本书特点是深入浅出。适合初学到高级的各层次的开发人员。
掌握C#最基本的要抓住两条主线:类型设计和语言特性。以上两本书正好在这两个方面各有侧重。在开发过程中精读一下这两本书,不仅有助于掌握和提高C#编程技能,同时也有助于形成简洁、优雅的代码风格。当然这里只是针对语言而言的,仅仅这些在编程上是不够用的,在语言之外还要使用到很多的知识和技能。
1. C#语言要点
C#是一门面向对象的、强类型的编译型语言。其基本的语法规则与其他的高级语言(如Java、C)没有太大区别。学习C#最主要的是把握类型设计和语言特性这两条主线。使用C#语言进行开发需要掌握如下图所示的相关要点:
图1 C#语言要点
2.C#语言特点
编译型
编译型语言:相对于解释性语言而言的,程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时直接使用编译的结果,不需要重新翻译。
编译型语言特点:编写的程序执行效率高、依赖编译器、跨平台性差些。
Java、C、C#、C 等都是编译型语言。
解释性语言:编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,省了道编译工序。但在运行程序的时候,解释性语言必须先解释再运行。
强类型
一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。Java、C#、C 等都是强制类型定义的。
面向对象
相对于面向过程而言的。面向对象涉及三大特性和六大原则。
三大特性:封装、继承、多态
一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态就是指一个类实例的相同方法在不同情形有不同表现形式。
六大基本原则 :
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,有且只有一个原因引起类的变化。实际上一个类可以通过实现多个接口来提供多个职责,每个接口的职责单一,这也是满足单一职责原则的(因为实际上我们开放的是接口,而不是类)。
单一职责原则,适用于类、接口,也适用于方法(方法的功能尽可能单一,颗粒度要细而不是粗)。
里氏替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
做系统设计时,经常定义一个接口或抽象类,然后编码实现,调用类则直接传入接口或抽象类,其实这里使用了里氏转换原则。
在类中调用其他类时务必使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
依赖倒置原则(the Dependency Inversion Principle DIP)
高层模块不应该依赖底层模块,两者都应该依赖其抽象。抽象比应该依赖细节,细节应该依赖抽象。
接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
建立单一接口,不用建立臃肿庞大的接口(接口尽量细化,接口中的方法尽可能少)。
尽量使用多个专门的接口。
迪米特法则(Law of Demeter LoD)
一个对象应该对其他对象有最少的了解,类间解耦,弱耦合。
然而使用该原则可能产生大量的中转或跳转类,导致系统复杂度提高,需反复权衡。
一个类跳转两次以上才能访问到另一个类,就需要重构了。
开放封闭原则(Open-Close Principle OCP)
对修改封闭,对扩展开放。
3.C#基础语法规则
变量
变量是一段有名字的连续存储空间。在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间。变量具有名称、类型和值。
变量名是变量在程序源代码中的标识。变量类型确定它所代表的内存的大小和类型,变量值是指它所代表的内存块中的数据。
在程序的执行过程中,变量的值可以发生变化。使用变量之前必须先声明变量,即指定变量的类型和名称。
表达式
由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。
一个表达式代表一个函数,其输入为自由变量的定值,而其输出则为表示式因之后所产生出的数值。
(1)算术表达式:又称为数值表达式,通过算术运算符来进行运算的数学公式。
(2)逻辑表达式:结果为true或false
=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)
NOT(非)、AND(与)、OR(或)
(3) 赋值表达式:将等号右边的表达式结果赋值给等号左边的变量
(4) 三元表达式
表达式1?表达式2:表达式3
表达式1为true则返回表达式2,否则返回表达式3。例如:
int num1 =53,num2 = 27
int num3 = num1 > num2 ? num1: num2;
语句和语句块
语句可以是以分号结尾的单行代码,或者是语句块中的一系列单行语句。语句块括在括号 {} 中,并且可以包含嵌套块。
程序所执行的操作以“语句”表达。常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。语句在程序中的执行顺序称为“控制流”或“执行流”。根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同。
流程控制
-> 选择结构 if、if-else、if-else if switch-case
-> 循环结构While、do-while for、foreach
-> 跳转语句break、 continue、 goto(认为禁用)
(1)每一个逻辑都是使用这两个逻辑(选择、循环)进行混合实现。
跟计数变量有关的一般用for循环
跟数字无关或跟bool型值有关的一般用while循环
(2)switch-case语法
在case中存放用来比照的值,根据传进来的数据定位到相应选项执行代码块
每一个case后都需要一个break(多条case匹配一个执行代码的时候,可以省略break)
switch括号中的数据类型没有特别的限制,int、字符串或对象都可,在Java中是限制了为int的且case后要使用常量进行对比。
(3)语法熟练掌握:
C#中for循环的第一次是否执行也是要判断条件的。
for循环 执行i=0,判断条件为真则执行方法体代码,条件为假则一次也不执行;然后i ,条件为真继续循环,条件为假,结束循环。
for (int i = 0; i < 5; i ) { }
break 跳过循环体的剩余部分直接退出结构体或循环体
continue 语句是跳过循环体的剩余部分而继续下一次循环,非循环体跳出往后执行
方法
C#中的定义:
方法是包含一系列语句的代码块。C# 中每个执行指令都是在方法的上下文中完成的。
方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称以及任何方法参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。
理解:
出于复用目的的对代码块的封装,并赋予一个名称(即方法名),可以通过简单语句(调用)来执行方法中所有代码。
提供参数传入,以便为方法的执行设置初始条件,提高方法的可复用性。
可以定义返回值,以便调用方法时可以用一个变量来接收执行结果。void表示无返回值。
异常和异常处理
各种类型的异常最终都是由 System.Exception 派生而来。
C# 语言的异常处理使用 try、catch 和 finally 关键字尝试某些操作,以处理失败情况。throw抛出异常,try catch捕获异常, finally {} 里面进行销毁资源,释放内存之类的操作。
公共语言运行时 (CLR)、.NET Framework 或任何第三方库或者应用程序代码都可以生成异常。异常是使用 throw 关键字创建的。
异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所引发。在这种情况下,CLR 将展开堆栈,查找是否有方法包含针对该特定异常类型的 catch 块,如果找到这样的方法,就会执行找到的第一个这样的 catch 块。如果在调用堆栈中的任何位置都没有找到适当的 catch 块,就会终止该进程,并向用户显示一条消息。
关键字
关键字是对编译器具有特殊意义的预定义保留标识符。它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是一个合法的标识符,而 if 不是合法的标识符,因为它是关键字。
迭代语句:do, for, foreach, in, while
跳转语句:break, continue, default, goto, return,yield
异常处理语句:throw, try-catch, try-finally, try-catch-finally
基元类型和值:byte , double, char, float , int
数据类型定义:struct , enum, class , interface,delegate,string
访问修饰符:public, private , protected , internal
修饰符:event,abstract , virtual , static, const,readonly,external,override,sealed,unsafe
方法参数:params, out, ref
命名空间:using
访问:base , this
运算符:as , is , new , sizeof , typeof,true , false