新書推薦:
《
伟大民族:从路易十五到拿破仑的法国史(方尖碑)
》
售價:NT$
857.0
《
古今“书画同源”论辨——中国书法与中国绘画的关系问题兼中国画笔墨研究
》
售價:NT$
602.0
《
《日本文学史序说》讲演录
》
售價:NT$
332.0
《
无尽的海洋:美国海事探险与大众文化(1815—1860)
》
售價:NT$
454.0
《
治盗之道:清代盗律的古今之辨
》
售價:NT$
556.0
《
甲骨文丛书·剑桥世界暴力史(第一卷):史前和古代世界(套装全2册)
》
售價:NT$
959.0
《
甲骨文丛书·中华早期帝国:秦汉史的重估
》
售價:NT$
1367.0
《
欲望与家庭小说
》
售價:NT$
449.0
|
編輯推薦: |
1. 本书主要内容包括C#语法、面向对象编程、Windows编程、数据库、GDI 绘图、网络和线程等章节。ASP.NET网站和WPF等内容不包括在内,这主要是因为这些内容很复杂,不是短篇幅能阐述的。2. 用电脑绘图,是我学习计算机的动力之源,当看到自己绘制的图形闪现在屏幕上,有种别人为无法理解的美学感受,在工程实践中更是经常使用这方面的知识,非常遗憾的是C#专门讲述GDI 绘图的很少,我想GDI+绘图一章可能会吸引像我一样的读者,如果别人有这个教材,我一定会购买的。我在工程实际中用到*多的就是网络编程,特别是物联网,手机,移动终端等程序开发,都需要非常透彻了解了解网络协议,就数据传输来说主要有Sockets,TCP,UDP等技术,只要牵涉网络就很复杂。本书对此进行了全面解析。由于其复杂性,笔者也经常遗忘,但每次应用时,就会打开自己写的教程。我希望其他读者,也会将我的教程当作案头字典,甚至经典。
|
內容簡介: |
本书从语法讲起,由浅入深,层层深入,尽量用简洁的语言、少量的代码解释复杂的C#程序; 主要内容包括C#语法、面向对象编程、Windows编程、数据库、GDI 绘图、网络和线程等。本书适合作为高等院校本科生和研究生的教材。
|
目錄:
|
目录
第1章初识C#
1.1Visual Studio.NET简介
1.2.NET Framework简介
1.3C#简介
1.4Visual Studio .NET开发环境
第2章接触C#
2.1第一个C#程序
2.2关于控制台程序
2.3C#程序基本结构
2.3.1最简单的C#结构
2.3.2控制台基本输入和输出语句
2.4编程习惯
第3章C#语法
3.1变量与常量
3.1.1数值类型
3.1.2变量定义
3.1.3常量定义
3.1.4数据类型转换
3.2运算符
3.2.1算术运算符
3.2.2关系运算符
3.2.3逻辑运算符
3.2.4位运算符
3.2.5赋值运算符
3.2.6三元条件运算符
3.2.7运算符的优先级
3.3选择语句
3.3.1if语句
3.3.2switch语句
3.4循环
3.4.1while
3.4.2do while
3.4.3for
3.4.4foreach语句
3.4.5跳转语句
3.5异常
3.5.1try catch语句
3.5.2throw语句
第4章字符串、时间和简单数组
4.1字符串
4.1.1字符串的定义
4.1.2转义字符
4.1.3字符串的操作
4.1.4数值与字符串的相互转化
4.1.5占位符
4.1.6string.Format
4.1.7格式化字符串
4.1.8StringBuider
4.1.9字符串索引
4.2简单数组
4.2.1一维数组
4.2.2多维数组
4.2.3锯齿数组
4.2.4数组应用举例
4.3时间
4.3.1DateTime
4.3.2日期时间字符串的显示格式
4.3.3DateTime的计算
4.3.4TimeSpan
第5章面向对象编程
5.1面向对象
5.2类和对象
5.3封装、继承、多态
5.4程序结构
5.5名称空间
5.6部分类
5.7类的成员
5.7.1访问修饰符
5.7.2字段
5.7.3方法
5.7.4属性
5.8过程代码写在哪里
5.9方法重载
5.10构造函数
5.11析构函数
5.12this
5.13静态成员
5.14运算符重载
5.15引用类型与值类型
5.16装箱与拆箱
5.17函数的参数
5.18索引
5.19结构
5.20枚举
第6章继承与多态
6.1继承
6.2base关键字
6.3派生类的构造函数
6.4Object类
6.5多态
6.6隐藏方法new
6.7虚方法virtualoverride
6.8抽象类与抽象方法
6.9密封类和密封方法
6.10ToString
6.11接口interface
第7章委托与事件
7.1委托定义
7.2委托参数
7.3多播委托
7.4匿名委托
7.5委托耦合
7.6关于事件
7.7发布订阅
7.8事件参数
7.9事件句柄EventHandler
7.10事件参数EventArgs
第8章泛型
8.1泛型概念
8.2泛型类
8.2.1定义泛型类
8.2.2泛型类的默认值default
8.2.3泛型约束
8.3泛型接口
8.4泛型结构
8.5泛型方法
第9章数组与集合
9.1对象数组
9.2Array类
9.2.1Array数组创建
9.2.2Array数组复制
9.2.3Array数组排序
9.3元组
9.4列表
9.4.1ArrayList
9.4.2List
9.5队列
9.6栈
9.7链表
9.8有序列表
9.9字典
9.10有序字典
9.11Lookup类
9.12集
9.13可观察集合
9.14位数组
9.14.1BitArray
9.14.2BitVector32
第10章Windows窗体
10.1第一个窗体
10.2第一个按钮
10.3多个窗体
10.4认识窗体类
10.4.1三个文件
10.4.2Form1.cs
10.4.3Form1.Designer.cs
10.5简易计算器
10.6窗体和控件的属性
10.6.1大小和位置
10.6.2控件的停泊与锚点
10.6.3捕捉按钮小游戏
10.6.4颜色设置
10.7鼠标键盘事件
10.7.1鼠标事件
10.7.2键盘事件
10.7.3两个特殊的键盘事件
10.8事件的一些问题
10.9多文档界面
10.10窗体的状态
10.11窗体事件的执行顺序
10.12两个窗体之间传递数据
第11章Windows控件
11.1Windows工具箱
11.2公共控件
11.2.1RadioButton
11.2.2CheckBox
11.2.3ListBox
11.2.4ComboBox
11.2.5TreeView
11.2.6PictureBox控件
11.3菜单和工具栏
11.3.1MenuStrip
11.3.2ToolStrip
11.3.3ContextMenuStrip
11.4容器控件
11.4.1FlowLayoutPanel
11.4.2TableLayoutPanel
11.4.3SplitContainer
11.4.4TabControl
11.5对话框
11.5.1ColorDialog和FontDialog
11.5.2FolderBrowserDialog、OpenFileDialog和SaveFileDialog
第12章文件操作
12.1Directory和DirectoryInfo
12.1.1Directory
12.1.2DirectoryInfo
12.2File和FileInfo
12.2.1File
12.2.2FileInfo
12.3Path和DriveInfo
12.3.1Path
12.3.2相对路径
12.3.3DriveInfo
12.4文件读写
12.4.1File读文件
12.4.2写入文件
12.5流
12.5.1读写二进制文件
12.5.2读写文本文件
12.6资源管理器
第13章数据库
13.1C#与数据库的关系
13.2SQL语言
13.3ADO.NET
13.4C#调用Access数据库
13.4.1OleDbConnection
13.4.2OleDbCommand
13.4.3OleDbDataReader
13.4.4OleDbDataAdapter
13.5DataTable
13.5.1DataTable的定义
13.5.2DataColumn
13.5.3DataRow
13.5.4DataTable提取数据库数据
13.5.5编辑DataTable中的数据
13.5.6DataRow的状态
13.5.7DataRow的版本
13.6DataView
13.7DataSet
13.7.1DatSet与DataTable
13.7.2DataSet关系
13.7.3DataSet约束
13.8DataGridView
13.8.1行和列
13.8.2单元格
13.8.3行宽和列宽
13.8.4冻结
13.8.5排序
13.8.6隐藏
13.8.7列包含控件
13.8.8虚拟模式
13.9服务器资源管理器
13.10BindingSource
13.10.1BindingSource的简单应用
13.10.2BindingSource的定位
13.10.3BindingSource的排序过滤与查找
13.10.4Binding类
13.11可视化数据控件
13.11.1DataSet控件
13.11.2BindingNavigator控件
13.12窗体控件与数据库
13.12.1ComboBox
13.12.2窗体控件与DataSet
13.12.3控件的数据库向导
13.13综合实例
13.13.1创建数据库
13.13.2创建主窗体
13.13.3创建操作数据库的公共类
13.13.4创建图书类别窗体
13.13.5创建增加图书窗体
13.13.6创建编辑图书窗体
13.13.7创建图书查询窗体
13.14C#调用SQL Server数据库
13.14.1关于SQL Server Express数据库
13.14.2创建SQL Server Express数据库
13.14.3C#调用SQL Server Express数据库
第14章Lambda表达式与扩展方法
14.1代码简化的历程
14.1.1代码简化1
14.1.2代码简化2
14.1.3代码简化3
14.1.4代码简化4
14.1.5代码简化5
14.1.6代码简化6
14.2Lambda表达式
14.3Func,Action和Predicate
14.3.1Func
14.3.2Action
14.3.3Predicate
14.4委托在List中的简单应用
14.5扩展方法
第15章Linq
15.1准备数据
15.2投影和筛选
15.3排序
15.4分组
15.5复合from
15.6延迟执行与立即执行
15.6.1延迟执行
15.6.2立即执行
第16章GDI 绘图
16.1GDI与GDI
16.2绘制简单图形
16.3GDI 绘图原理
16.4Color
16.4.1RGB
16.4.2ARGB
16.4.3网络安全色
16.4.4Color结构
16.5Pen和Brush
16.5.1Pen
16.5.2Brush
16.6Graphics
16.7Point、Size和Rectangle
16.7.1Point和PointF
16.7.2Size和SizeF
16.7.3Rectangle和RectangleF
16.8绘制图形
16.9绘制文本
16.10绘制图片
16.11图形变换
16.12屏幕刷新问题
16.13Invalidate
16.14橡皮筋
16.15Image和BitMap
16.16ColorMatrix
16.17绘制函数曲线
16.17.1简单函数曲线
16.17.2动态曲线
16.18不使用OnPaint、Invalidate的方法
第17章网络编程
17.1网络基本概念
17.1.1TCPIP
17.1.2Socket套接字
17.1.3其他相关概念
17.1.4客户与服务器
17.2Socket程序
17.3TCP程序
17.4UDP程序
17.4.1UDP客户端
17.4.2UDP服务端
17.5异步通信
17.5.1同步和异步
17.5.2Socket异步连接
17.5.3Socket异步连接
17.6聊天程序
17.6.1客户端
17.6.2服务端
第18章线程
18.1进程与线程
18.2异步委托
18.2.1同步委托
18.2.2异步委托
18.2.3IAsyncResult
18.2.4异步回调AsyncCallback
18.2.5异步回调的Lambda表达式
18.3线程
18.3.1Thread
18.3.2给线程命名
18.3.3给线程传递参数
18.3.4线程的控制
18.3.5优先级
18.4线程池
18.5争用
18.6Windows窗体的线程问题
18.6.1Timer控件的问题
18.6.2System.Threading.Timer类
18.6.3System.Timers类
18.7BackgroundWorker
18.7.1BackgroundWorker控件
18.7.2BackgroundWorker类
18.8窗体与线程交换数据的一种简易方法
第19章关于变量命名
后记
|
內容試閱:
|
前言
本书以简洁的叙事方式对C#语言进行讲述,如果您想高效率地学习C#,并喜欢代码简洁,请打开本书。对于C#初学者,大多数教材读起来非常吃力,这方面笔者有切身的体会,特别是那些冗长的变量命名,整页的程序代码,令人望而生畏。很多内容其实一句话可以说清,如果用很大篇幅讲解,这对初学者是不利的。本书的写作初衷就是让读者省力,节约时间,为读者扫清阅读障碍。在此方面本书做了最大努力,减少代码量,不让读者有读不下去的感觉。这也是本书不提供配套素材的根本原因。如果您觉得还是需要光盘或是源代码,说明本书做得还不够好,笔者将吸取经验,尽量做到极致。本书前面部分介绍VS.NET和C#的基本知识,去除大量无用的专业术语,对菜单工具栏等界面进行简单介绍,让读者可以直接切入C#主题。面向对象概念是C#编程的核心内容,对象这个术语过于学术化,其真正的意义其实是物体,C#语言在某种程度上来说是对自然界的一种描述语言,与日常用语是一样的。本书尽量将C#语言与身边事物和日常语言相结合,力求让学生理解其内涵。类似委托与事件对初学者来说很难理解,本书可以做到两三行语句让读者透彻理解,这是本书的特色之一。Windows和数据库程序应该是很多读者学C#语言的目的,特别是数据库编程应用极为广泛,数据库内容在本书中占了大部分篇幅。用计算机绘图是笔者学习计算机技术的动力之源,C#提供了GDI ,可以开发绘图程序和工业实时仿真曲线等,目前很少有教材对C#绘图做全面的介绍,但其应用却非常广泛,本书将对C#绘图进行全面解析。网络和线程是物联网、互联网 、虚拟现实、增强现实、移动通信等的核心内容,这些都是应用程序的主流发展方向,本书对此进行了全面分析。ASP.NET和WPF等内容不包含在本书之内,不是它们不重要,而是它们很复杂,不是一两章内容所能讲清楚的,若因为没有这些内容而放下本书,那是不明智的。本书希望给C#初学者带来福音,能成为读者的案头字典,甚至经典。本书非常适合作为本科生,研究生的教材。也适合那些喜欢编程的人,喜欢成为编程高手的人。编程不只是技术,同时也是艺术。编者
2016年6月
第3章
C#语法
与其他编程语言相比,C#语言在接近人类语言方面更胜一筹,C#继承了C语言大部分的语法结构,但与C语言也有很大不同,例如C#取消了令人讨厌的指针。3.1变量与常量C#毕竟是程序语言,总会和日常用语有所不同,例如日常中人们会说半径为1.2米,学生人数是30,说的时候并不考虑1.2是整数还是小数,但C#是必须要考虑类型的,就因为C#考虑了类型,给初学者造成了很大困扰。记住,C#是强类型语言,变量必须经过定义才能使用。3.1.1数值类型C#的数值类型包括整数、实数、布尔类型等。数值类型如表31所示。
表31数值类型
C#别名.NET CTS类型范围说明
整数sbyteSystem.SByte-128~1278位有符号整数byteSystem.Byte0~2558位无符号整数shortSystem.Int16-32768~3276716位有符号整数ushortSystem.UInt160~6553516位无符号整数intSystem.Int32-231~231-132位有符号整数uintSystem.UInt320~232-132位无符号整数longSystem.Int64-263~263-164位有符号整数ulongSystem.UInt640~264-164位无符号整数charSystem.CharUnicode字符编码16位无符号整数实数floatSystem.Single1.510-45~3.410-3832位单精度doubleSystem.Double5.010-324~3.410-30864位双精度decimalSystem.Decimal1.010-28~7.91028128位高精度十进制数
布尔boolSystem.Boolearntrue和false1位二进制
学过C语言的同学可能熟悉int、float、double等。初学者可能对这些数据类型感到迷惑,比如int和System.Int32究竟是什么关系,在编程中应该使用哪一个。在.NET中,定义了通用类型系统Common Type System,CTS,不管采用VB.NET或C#,所定义的数据类型都将被翻译成CTS类型。而我们熟悉的int、float等是属于C#语言自身独有的,int是System.Int32在C#中的别名。我们可以认为int和System.Int32就是一回事。double和System.Double是一回事。用户愿意用哪一个是自己的爱好问题。在实数中有一个我们不熟悉的类型decimal,它主要用于财务货币计算,可以精确地表示十进制小数,如十进制数0.003用其他类型会产生误差,而用decimal虽然也会有误差,但由于位数多达128位,因而十分精确,虽然位数多,但取值范围不如float和double大。各种类型的数值表达如下。1. 整数类型整数类型分为无符号数和有符号数,这里的符号指的是负号。无符号的数就是只能取正数。一些整数类型如下:
int a=123;
long b=23L;L可以写成l
uint c=123U;U可以写成u
ulong d=123UL;UL可以写成ul
如果是十六进制在数字前面加0x或0X,数字基数为0~9、A~F或a~f。例如:
int a=0x23; 十进制35
Int b=0xAB; 十进制171
如果是decimal类型,则在数字后面加M或m,如:
decimal a=23.6M
2. char类型char类型属于一种特殊的整数类型。它采用Unicode编码格式对每个字符都进行了编码,字符的写法是对单个字符加单引号,例如a,A,大,等。注意单引号中只能放一个字符转义字符除外,如ab是错误的。但转义字符\n是正确的,它代表回车,关于转义字符串后面会详述。一些字符的Unicode编码如表32所示。
表32字符的Unicode编码
字符Unicode编码十进制整数字符Unicode编码十进制整数
a97大22823A65\n10946
3. 实数类型如果只写出带小数点的数据,系统默认为是double型,这是要值得注意的事。这与C语言有所不同。如果需要float型,必须在后面加F或f,否则出错,如:
double a=12.8;
floatb=12.8F; 后面必须有F或f
这些数据类型都不区分大小写。如12.8F和12.8f没有区别。4. 工程计数法
double a=2e3; 值为2000即2103
double b=3E-4; 值为0.0004即210-4
工程计数法表示的值都是double型,写成e或E都可以。
3.1.2变量定义1. 变量定义的语法
在C#中,定义一个整型变量a,以下两种写法完全等价:
int a;
System.Int32 a;
定义变量的格式是:
类型 变量名1, 变量名2;
类型 变量名1=初值1, 变量名2=初值2;
例如:
int a, b, c;
double d;
如果要对变量赋初值,如下:
int a;
a=3;
也可以直接写成一行,如下:
int a=3;
2. 类型推断
C#支持一种叫做类型推断的形式来定义变量,采用关键字var,如:
var a=3;int
var b=3.0;double
var c=true;bool
用var定义,变量根据右边的值自动判断数据类型。关于变量名的定义需要注意以下事项: 变量名必须以字母或下划线开头,后面可以是字母与变量的组合,也可以是汉字。注意变量名区分大小写。 变量名不能与C#的关键字重名。C#的关键字共有七十多个,例如int、float、using等不能用作变量名。 如果非要使用关键字,可以在变量名前面加@,例如@int是一个正确的变量。 在C#中可以使用汉字,希腊字母等作为变量,例如下面的变量名是合法的:
int ,, ;
double半径;
这些奇怪字符的使用增强了程序的可读性。 可以使用Unicode字符定义变量,用语法\uXXXX来指定,其中XXXX是Unicode字符的十六进制编码。由于字符a的Unicode十六进制码为00AA,所以下列用法等价。
int a=9;
int \u00AA=9;
声明了变量后,就不能再更改变量的类型了,例如下列语句会出现错误:
int a;
double a;
3. 变量作用域
变量的作用域为{ },如下面的代码会出错:
{
int a=5;
}
Console.Writea;
在{ }内的变量,在{ }外不存在。3.1.3常量定义常量是在编译时设定,在程序执行后不能改变。常量总是静态的,但不允许使用static进行修饰。例如:
const int a=10;
const double pi=3.1415926;
a=6;错误
static int b=13;错误
之所以定义常量,是因为在程序中可能多处需要某一个数,例如银行利率或圆周率等。如果总是写3.1415926很麻烦,所以在程序前面定义一个pi来代替3.1415926,如果需要修改,只改动这一行就可以了,例如改为const pi=3.14,程序的其他部分不动。这与变量很相似,但常量不能在运行时修改,变量在运行后是可以修改的。既然变量也可以做到与常量一样的事情,为啥还要定义常量呢?这主要是因为常量比变量效率高得多。3.1.4数据类型转换数据类型转换可分为隐式转换和显式转换,显式转换也称强制转换。在从取值范围小的类型转换到取值大的类型时采用隐式转换。例如:
int a=3;
double b=a;int 隐式转换为 double
强制转换的运算格式为:
类型变量
例如:
double a=3;
int b=int a;将double型转换为int型,需要强制转换
double c=2.6;
int d=int c;d的结果为2
由于double的取值范围比int大得多,要进行转换必须采用强制转换。此时需要考虑是否超出范围以及损失精度的问题。例如:
int a = 40000;a的值超过了short的取值范围32767
short b=shorta;b的值为-13035
这样的程序能通过编译,不报错,但结果却非常奇怪,居然变成了负数。这是因为int是32位的,而short是16位的。a的32位二进制如下:
强制转换为b后,由于b是short型,只有16位,因此b只截取了后16位,前16位扔掉了,如下:
1100110100010101
首位是1相当于负号,这是二进制的补码表示,结果就变成了-13035了。关于补码是怎样表示负数的,请读者查阅相关资料。这个过程相当于把100千克的桔子装入到只能装1千克桔子的塑料袋中,必然要有很多桔子散落在外面。3.2运算符C#的运算符主要有算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符等,这些运算符都连接操作数形成表达式。3.2.1算术运算符四则运算加、减、乘、除对应的符号是 、-、*、。在C#中还有几个运算符如表33所示。
表33算术运算符
运算符含义示例
%取模3%2,x%y自加1x,x--自减1x--,--x
1. 除法对于四则运算需要注意的是,当两个整数相除,结果还是整数,但如果有一个数是double型的,结果为double型,如:
72结果为3
72.0结果为3.5
2. %取模取模就是求余数,如:
7%2结果为1
6%2结果为0
7%2.0结果为1
3. 和--该运算符会让人感到迷惑。可以这样记忆:a使用前 1,a使用后 1那什么是使用前,使用后呢?C#代码都是以分号;结束的,在一个表达式内出现a或a时,就叫使用前,在;之后就叫使用后。按照上面的口诀记忆。在;之后,a的值相同,即都 1。例如:
int a=5;
int b=a*2;b的值为10,其中 a原来是5在这句里仍旧是5不 1,
int c=a;c的值为6,a使用后 1
、--运算符是一元运算符,它的优先级比四则运算级别高,因此先计算a然后计算a*2,由于在a后面,所以在本表达式中a的值仍为5,所以b为10,使用之后a自加1,a的值为6。下面是a的结果:
int a=5;
int b=a*2;b的值为12
int c=a;c的值为6
、--运算符为C编程语言独有的一种运算方法,就是对变量进行 1或-1,a在结果上等价于a=a 1;但在效率上a更高效。3.2.2关系运算符关系运算符用来比较两个操作数,运算结果为bool类型,如表34所示。
表34关系运算符
运算符说明运算符说明
大于=大于等于3;a的值是false
3.2.3逻辑运算符逻辑运算符的操作数是两个bool值,结果也是bool值,如表35所示。
表35逻辑运算符
运算符说明运算符说明
&与^异或|或&&短路与!非‖短路或
其中&、|、!、^遵循布尔运算操作规律。异或^不太好理解,可以这样记忆: 不同为真,相同为假。例如:
bool a=12^32; 两个操作数分别为true和false,则异或后a结果为true
bool a=32^32 ;a的结果为false
&&、‖两个运算符,如果只计算第一个操作数就能得到结果,就不进行后一个操作数的计算,更高效,所以称为短路与、短路或。例如:
bool a=12&32分别计算12为false,32为true,b的结果为false
采用短路与的形式如下:
bool a=12&&32 计算12为fase,就已经能得到最终结果,不计算32
但如果是下面的代码:
bool a=32&&12 计算32为true,这时不能得到结果,还要计算12为false,才能得到最终结果false
3.2.4位运算符位运算符如表36所示。
表36位运算符
运算符说明示例(用二进制说明)
&按位与11&10结果为10|按位或11&10结果为11~按位反~10结果为01^按位异或11^10结果为01右移10112,右移2位左侧补0结果为0010: 右移动1位,如果右侧的0足够多,相当于将数除以2。例如:
int a=2&3;a的结果是2
int a=2|3;a的结果是3
int a=41a的结果是2
3.2.5赋值运算符=为赋值运算符,我们已经很熟悉了。在C#中还有几个复合赋值运算符,如x =6,它的意思是x=x 6,这看上去很奇怪,不好理解,但这样写程序代码执行效率高。类似的赋值运算符有-=、*=、=、&=、|=、^=、=、0?1:0;y的结果为1
首先判断x0是否正确,如果正确该值为1,不正确该值为0。恰当运用三目运算符可以大大减少程序代码,否则需要大量的if else等语句。3.2.7运算符的优先级运算符具有优先级,如表37所示。运算符从高到低排序。如:
int a=1 2*3;结果为7
复杂的表达式尽量用改变表达式的优先级,这样层次更清晰。如:
int b=1 2*3; 结果为9
表37运算符的优先级
运算符从高到低排序
一元后缀--一元前缀---!~二元* %二元 -移位关系=相等和不等==!=逻辑与&逻辑异或^逻辑或|短路与&&短路或‖三元?:赋值=*== =-==&=^=!=
3.3选 择 语 句C#中的选择语句主要有两种,分别是if语句和switch语句。3.3.1if语句if语句的几种结构如下:
if ...
{
}if ...
{
}
else
{
}if ...
{
}
else if ...
{
}
else
{
}
其中if中的条件必须为bool型,这与C语言有很大不同,C语言认为条件不为0即为真。如下面的语句在C语言中正常,而在C#中则是错误的,原因是if条件必须是布尔型。
int x = 10;
if x此句C语言正确,C#错误
{
}
如果只有一行语句,可以省略大括号{},如下面的语句:
int x=2;int y;
if x0
{
y=2*x;
}
else
{
y=-x;
}
可以写成:
int x=2;int y;
if x0
y=2*x;
else
y=-x;
例31从键盘输入一个成绩,判断是否为及格。程序如下:
using System;
class A
{
static void Main
{
string a = Console.ReadLine;从键盘读入一个字符串
int b = int.Parsea;将字符串转换成整数
if b = 60
{
Console.WriteLine"及格";
}
else
{
Console.WriteLine"不及格";
}
Console.ReadLine;
}
}
运行结果如下:
35
不及格
3.3.2switch语句switch语句是一个多分支语句,可以用if语句实现同样的功能,但if语句过多会使程序看起来很乱,使用switch层次会更清晰。例32从键盘输入一个成绩,判断其优、良、中、及格、不及格。代码如下:
using System;
class A
{
static void Main
{
string a = Console.ReadLine;
int b = int.Parsea;
switch b 10
{
case 10:
Console.WriteLine"优";
break;
case 9:
Console.WriteLine"优";
break;
case 8:
Console.WriteLine"良";
break;
case 7:
Console.WriteLine"中";
break;
case6:
Console.WriteLine"及格";
break;
default:其他情况
Console.WriteLine"不及格";
break;
}
Console.ReadLine;
}
}
使用Switch语句要注意以下几个问题:(1)switch表达式中表达式必须是数值,字符串,枚举等类型如int、double、string等。(2)case中的表达式必须与switch 中的类型一致。(3)不能贯穿。CC等语言中都有一个问题,就是第一个case语句执行完,不退出switch,接着执行下一个case,这显然很糟糕,如要退出需要加break。C#避免了这种情况,每个case块都要加break,否则程序不能编译。(4)但有一种情况例外,可以贯穿,例如程序中case 10和case 9,成绩都是优,就没有必要写两遍。可以改成如下形式,注意case 10和case 9并列执行同一代码块。case 10中没有代码块,也没有break。
switch b 10
{
case 10:
case 9:
Console.WriteLine"优";
break;
case 8:
}
3.4循环C#提供了4种循环语句: while、do while、for和foreach。3.4.1whilewhile语句的格式如下:
while 条件
{
}
如果循环体只有一行语句,可以省略{ }。例33试计算1 2 3 100。
using System;
class A
{
static void Main
{
int i = 1;
int s = 0;
while i = 60
{
Console.WriteLine"及格";
}
else
{
Console.WriteLine"不及格";
}
}
}
}
程序中加了while循环,注意条件是true,这样的条件永远成立,将会是一个死循环。必须采用某种机制使其退出。程序中加粗的代码的意思是: 在键盘上输入game over则退出循环。运行结果如下:
30
不及格
62
及格
87
及格
game over
3.5异常计算机程序运行后不可避免地会出现异常,如除数为0、对象不存在、类型转换错误等,要使程序在出现错误时不崩溃,需要采用异常捕获机制。3.5.1try catch语句可以采用try catch语句捕获运行中的异常,其语法格式如下:
try
{
...可能有错误的代码段
}
catch
{
...错误处理
}
finally
{
...不管是否有错误都执行的代码段
}
其中finally部分可以省略。catch段的代码还可以捕获错误的具体信息,如下:
try
{
int x = 0;
int a = 1 x;
}
catchException exp
{
Console.WriteLineexp.ToString;
}
运行结果如下:
System.DivideByZeroException:尝试除以零。
捕获异常在程序编写中经常使用,有了该语句,应用程序就不会莫名其妙地死机。3.5.2throw语句本来没有异常的程序,可以人为制造异常,采用throw语句,代码如下:
try
{
for int i = 0; i
|
|