Web开发之C#:(2)C#语言及语法

作者:陆金龙    发表时间:2016-07-20 23:56   


参考书籍:

在介绍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 不是合法的标识符,因为它是关键字。

选择语句ifelseswitchcase

迭代语句doforforeachinwhile

跳转语句breakcontinuedefaultgotoreturnyield

异常处理语句throwtry-catchtry-finallytry-catch-finally

检查和未检查checkedunchecked

fixed 语句fixed

lock 语句lock

基元类型和值: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

上下文关键字:partialgetsetvaluewhereyield