《C#程序設(shè)計(jì)(第二版)》以通俗易懂的語(yǔ)言、生動(dòng)有趣的示例來(lái)講解C#多個(gè)方面的知識(shí),內(nèi)容安排兼顧廣度、深度,緊跟C#發(fā)展動(dòng)向,知識(shí)新穎,內(nèi)容豐富。開(kāi)發(fā)工具使用Visual Studio 2015,內(nèi)容囊括數(shù)據(jù)類型、運(yùn)算符、程序控制、面向?qū)ο、?shù)組、字符串、Windows Form程序設(shè)計(jì)、文件、集合、泛型、GDI+、多線程、序列化、SQL、ADO.NET、實(shí)用類庫(kù)等。
全書(shū)講解過(guò)程中配備了大量示例,示例簡(jiǎn)短精煉,融知識(shí)性趣味性于一體。為了給讀者釋疑解惑,也為了給部分學(xué)有余力的讀者提供深入學(xué)習(xí)的窗口,在每章都安排了問(wèn)與答環(huán)節(jié),講解了一些容易混淆的問(wèn)題或者擴(kuò)展一些課堂內(nèi)的知識(shí)。練習(xí)方面,也是分層遞進(jìn),注重梯度,按課堂練習(xí)→課堂思考→課后思考與練習(xí)→實(shí)戰(zhàn)任務(wù),逐層深入,難度逐步提升,符合一般的學(xué)習(xí)規(guī)律。另外,在實(shí)戰(zhàn)任務(wù)或者思考與練習(xí)中設(shè)計(jì)了不少具有實(shí)用價(jià)值的編程練習(xí),使讀者在學(xué)習(xí)的過(guò)程中不會(huì)感到編程枯燥無(wú)趣,體會(huì)到用C#編程其樂(lè)無(wú)窮。
本書(shū)適合大中專院校、培訓(xùn)機(jī)構(gòu)的學(xué)生及.NET愛(ài)好者使用,可用作C#面向?qū)ο蟪绦蛟O(shè)計(jì)、.NET Framework程序設(shè)計(jì)、WinForm應(yīng)用開(kāi)發(fā)、.NET下的數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)等課程的教材。
1.以通俗易懂的語(yǔ)言、生動(dòng)有趣的示例來(lái)講解C#各個(gè)方面的知識(shí),內(nèi)容安排兼顧廣度、深度,緊跟C#發(fā)展動(dòng)向,知識(shí)新穎、內(nèi)容豐富。開(kāi)發(fā)工具使用Visual Studio 2015,內(nèi)容既囊括了數(shù)據(jù)類型、運(yùn)算符、程序控制、數(shù)組、字符串等傳統(tǒng)內(nèi)容,也涵蓋了面向?qū)ο蟆indows Form 程序設(shè)計(jì)、文件、集合、泛型、GDI+、多線程、序列化、SQL、ADO.NET、實(shí)用類庫(kù)等。
2.全書(shū)講解過(guò)程中配備了大量示例,示例簡(jiǎn)短精煉,融知識(shí)性、趣味性于一體。為了給讀者釋疑解惑,在每章都安排了問(wèn)與答環(huán)節(jié)。練習(xí)方面,也是分層遞進(jìn),注重梯度,綜合性和難度逐步提升,符合一般的學(xué)習(xí)規(guī)律。
前言
C#作為.NET Framework下的首選語(yǔ)言,是一種簡(jiǎn)潔優(yōu)雅、多用途、面向?qū)ο蟮默F(xiàn)代化語(yǔ)言,它兼具C語(yǔ)言的語(yǔ)法特征、Visual Basic的快速開(kāi)發(fā)特征、Java的虛擬機(jī)運(yùn)行特征,可謂集百家之長(zhǎng)。
目前開(kāi)設(shè).NET相關(guān)課程的高校越來(lái)越多,相關(guān)的課程主要涉及如下幾個(gè)方面: C#面向?qū)ο蟪绦蛟O(shè)計(jì)、.NET Framework程序設(shè)計(jì)、WinForm應(yīng)用開(kāi)發(fā)、ASP.NET Web應(yīng)用開(kāi)發(fā)、WPF程序設(shè)計(jì)、Silverlight開(kāi)發(fā)、Windows Phone開(kāi)發(fā)、.NET下的數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)等。
雖然目前市面上關(guān)于C#的教材很多,不過(guò)在我們近幾年的教學(xué)過(guò)程中,卻發(fā)現(xiàn)這些教材或多或少存在一些缺陷和不足之處,總結(jié)如下:
。1) 內(nèi)容陳舊。有些教材在內(nèi)容安排上過(guò)于陳舊,仍然只講C#2.0的知識(shí)。
。2) 講解方法不合理。有的教材在講解C#的基礎(chǔ)知識(shí)時(shí),大量使用龐大的示例,動(dòng)輒好幾頁(yè)的代碼; 而有的教材則喜歡使用數(shù)據(jù)結(jié)構(gòu)的知識(shí)來(lái)講解C#的基礎(chǔ)知識(shí)。我們認(rèn)為,目前有一部分學(xué)生(包括很多IT從業(yè)人員),數(shù)據(jù)結(jié)構(gòu)方面的知識(shí)并沒(méi)完全理解,在這種情況下,使用數(shù)據(jù)結(jié)構(gòu)的例子來(lái)講解C#新的基礎(chǔ)知識(shí),對(duì)學(xué)生無(wú)疑是雪上加霜。這樣容易導(dǎo)致學(xué)生學(xué)習(xí)重點(diǎn)轉(zhuǎn)移,甚至有可能打擊學(xué)生的學(xué)習(xí)興趣。
。3) 講解抽象或者死板。不少教材講解太抽象,講解多而實(shí)例少,學(xué)生學(xué)習(xí)效果不佳。有的教材甚至從MSDN上復(fù)制不少內(nèi)容,雖然MSDN的內(nèi)容權(quán)威,但是MSDN上的很多敘述拗口、讓人費(fèi)解。
(4) 概念性錯(cuò)誤。少數(shù)教材在基本概念性知識(shí)方面存在錯(cuò)誤,如DateTime、TimeSpan是典型的結(jié)構(gòu),好幾套教材都稱之為類,這樣基本性的錯(cuò)誤容易誤導(dǎo)學(xué)生對(duì)這兩種數(shù)據(jù)類型的理解。
。5) 示例多、講解少。有些教材或者書(shū)籍,具有大量的示例,但卻缺少基礎(chǔ)的講解,僅僅只是大量示例的羅列而已,缺少對(duì)本質(zhì)內(nèi)容的講解,學(xué)生也因此理解不到位,最終只會(huì)些花招而內(nèi)功不足。這些書(shū)籍可以作為教材的有益補(bǔ)充,用作課后練習(xí)之用。
鑒于以上一些原因,我們編著了本書(shū)。本書(shū)以通俗易懂的語(yǔ)言、生動(dòng)有趣的示例來(lái)講解C#多方面的知識(shí),內(nèi)容安排兼顧廣度、深度,緊跟C#發(fā)展動(dòng)向,知識(shí)新穎,內(nèi)容豐富。本書(shū)代碼開(kāi)發(fā)工具使用Visual Studio 2015,內(nèi)容既囊括了數(shù)據(jù)類型、運(yùn)算符、程序控制、數(shù)組、字符串等傳統(tǒng)內(nèi)容,還涵蓋了面向?qū)ο、Windows Form程序設(shè)計(jì)、文件、集合、泛型、GDI+、多線程、序列化、SQL、ADO.NET、實(shí)用類庫(kù)等。
本書(shū)具有如下特點(diǎn):
。1) 語(yǔ)言通俗易懂。在寫作本書(shū)的過(guò)程中,在內(nèi)容的講解上力求通俗易懂,但這樣做的風(fēng)險(xiǎn)很大。因?yàn)橥ㄋ滓锥途_是一對(duì)矛盾。雖然從MSDN復(fù)制內(nèi)容過(guò)來(lái)既輕松又權(quán)威,不用擔(dān)心出錯(cuò),不過(guò)如果這樣,也就沒(méi)必要寫這本書(shū)了。我們的目的,就是在盡量保證準(zhǔn)確的前提下,把知識(shí)講解得易懂。
。2) 示例簡(jiǎn)短精煉。我們認(rèn)為,學(xué)習(xí)新知識(shí)時(shí),不是缺少長(zhǎng)篇累牘的代碼,而是缺少針對(duì)性強(qiáng)的精煉小示例。全書(shū)配套大量精選示例,幫助讀者理解所學(xué)知識(shí)。
。3) 示例融知識(shí)性和趣味性于一體。本書(shū)中很多的示例、思考與練習(xí)、實(shí)戰(zhàn)任務(wù)等都來(lái)自于我們長(zhǎng)期的教學(xué)積累,不少示例生動(dòng)、有趣而又具有實(shí)用價(jià)值,學(xué)生在學(xué)習(xí)的過(guò)程中不會(huì)感到編程枯燥無(wú)趣,當(dāng)經(jīng)過(guò)認(rèn)真思考并動(dòng)手實(shí)踐得到正確結(jié)果后,會(huì)充滿成就感而覺(jué)得用C#編程其樂(lè)無(wú)窮。
。4) 內(nèi)容新穎全面。除了上述所講的內(nèi)容外,細(xì)節(jié)知識(shí)方面涉及到隱式類型變量、匿名方法、Lambda表達(dá)式、可空類型、字符編碼、擴(kuò)展方法、Tuple、圖像算法及應(yīng)用、壓縮解壓等諸多新穎或?qū)嵱玫闹R(shí),還融入了不少編程經(jīng)驗(yàn)體會(huì)。
。5) 重點(diǎn)、難點(diǎn)突出。本書(shū)內(nèi)容全面充實(shí),重點(diǎn)、難點(diǎn)突出,如對(duì)面向?qū)ο蠡舜笃M(jìn)行全面細(xì)致的講解,這是整個(gè)課程體系的基礎(chǔ)核心所在。
。6) 思考練習(xí)層層遞進(jìn),注重梯度。練習(xí)方面,也是分層遞進(jìn),注重梯度,按課堂練習(xí)→課堂思考→課后思考與練習(xí)→實(shí)戰(zhàn)任務(wù),逐層深入,難度逐步提升,符合一般的學(xué)習(xí)規(guī)律,逐步加強(qiáng)學(xué)習(xí)效果。
。7) 問(wèn)答環(huán)節(jié)設(shè)計(jì)。在每章都安排了問(wèn)與答環(huán)節(jié),講解了一些容易混淆的問(wèn)題或者擴(kuò)展一些課堂內(nèi)的知識(shí),為學(xué)有余力的讀者開(kāi)了一扇扇去學(xué)習(xí)更多知識(shí)的窗口。
最后提及一下教材的使用。對(duì)于課時(shí)較少的院校,可以上學(xué)期安排第1~7章的授課內(nèi)容,而下學(xué)期安排第8~15章的內(nèi)容。對(duì)于多課時(shí)的院校,則可以根據(jù)自身情況選擇需要的章節(jié)學(xué)習(xí)。
本書(shū)可以用作下述課程的教材:
C#面向?qū)ο蟪绦蛟O(shè)計(jì)。
.NET Framework程序設(shè)計(jì)。
WinForm應(yīng)用開(kāi)發(fā)。
.NET下的數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)。
另外也可以作為如下課程的入門教材:
ADO.NET入門。
SQL入門。
多線程入門。
GDI+入門。
限于時(shí)間精力和水平,書(shū)中難免存在諸多值得推敲的地方,甚至?xí)袃?nèi)容的疏漏和錯(cuò)誤。各位專家、老師和讀者在使用過(guò)程中,如果發(fā)現(xiàn)任何問(wèn)題,歡迎不吝賜教。
感謝諸多領(lǐng)導(dǎo)、老師的指導(dǎo)與鼓勵(lì)支持,也感謝在教材使用過(guò)程中為本書(shū)提出建議的所有學(xué)生和老師。
編者
2016年7月
第1章概述
1.1.NET
1.2C#
1.3VS開(kāi)發(fā)環(huán)境
1.4編程初試
1.4.1控制臺(tái)程序
1.4.2WinForm程序
1.5問(wèn)與答
1.5.1學(xué)習(xí).NET相關(guān)技術(shù),將來(lái)能干什么
1.5.2何謂注釋,C#中的注釋有幾種
1.5.3使用VS.NET時(shí)有什么技巧
1.5.4VS太大,是否有更小巧的C#學(xué)習(xí)開(kāi)發(fā)環(huán)境
1.6思考與練習(xí)
1.7實(shí)戰(zhàn)任務(wù)
第2章數(shù)據(jù)類型與運(yùn)算符
2.1常量與變量
2.1.1常量
2.1.2變量
2.1.3變量的命名
2.1.4變量的命名法
2.2簡(jiǎn)單數(shù)據(jù)類型
2.2.1bool類型
2.2.2整型類型
2.2.3char類型
2.2.4小數(shù)類型
2.3枚舉類型
2.4結(jié)構(gòu)類型
2.5隱式類型變量
2.6運(yùn)算符
2.6.1算術(shù)運(yùn)算符
2.6.2賦值運(yùn)算符
2.6.3關(guān)系運(yùn)算符與邏輯運(yùn)算符
2.6.4位運(yùn)算符
2.6.5條件運(yùn)算符
2.6.6自增與自減
2.6.7運(yùn)算符的優(yōu)先級(jí)
2.7轉(zhuǎn)換
2.7.1隱式轉(zhuǎn)換
2.7.2顯式轉(zhuǎn)換
2.7.3Type.Parse
2.7.4Convert類
2.7.5裝箱與拆箱
2.7.6as & is
2.8問(wèn)與答
2.8.1數(shù)值類型那么多,怎樣記憶各類型的取值范圍
2.8.2如何知道數(shù)值類型占用多大存儲(chǔ)空間
2.8.3數(shù)值運(yùn)算中,除數(shù)不能為零嗎
2.8.40/0.0=?
2.8.5NaN和Infinity參與計(jì)算時(shí),結(jié)果如何
2.8.6定義枚舉類型時(shí),第一個(gè)枚舉對(duì)應(yīng)的數(shù)值必須為0嗎
2.8.7定義枚舉類型時(shí),各個(gè)枚舉項(xiàng)對(duì)應(yīng)的數(shù)值必須連續(xù)嗎
2.8.8如何更改枚舉類型元素的數(shù)據(jù)類型
2.8.9各種類型的默認(rèn)值分別是什么
2.8.10枚舉類型的位操作是什么意思
2.9思考與練習(xí)
2.10實(shí)戰(zhàn)任務(wù)
第3章程序控制
3.1選擇語(yǔ)句
3.1.1if語(yǔ)句
3.1.2switch語(yǔ)句
3.2循環(huán)語(yǔ)句
3.2.1for語(yǔ)句
3.2.2while語(yǔ)句
3.2.3do…while語(yǔ)句
3.3跳轉(zhuǎn)語(yǔ)句
3.3.1break語(yǔ)句
3.3.2continue語(yǔ)句
3.3.3goto語(yǔ)句
3.3.4return語(yǔ)句
3.3.5throw語(yǔ)句
3.4問(wèn)與答
3.4.1if和switch分別應(yīng)用于什么場(chǎng)合
3.4.2if和switch的各個(gè)分支的書(shū)寫順序有影響嗎
3.4.3如何避免太深的嵌套
3.4.4for、while、do…while分別應(yīng)用于什么場(chǎng)合
3.4.5如何知道程序執(zhí)行耗費(fèi)的時(shí)間
3.4.6如何產(chǎn)生隨機(jī)數(shù)
3.4.7什么叫程序集
3.5思考與練習(xí)
3.6實(shí)戰(zhàn)任務(wù)
第4章面向?qū)ο蠡A(chǔ)
4.1類與對(duì)象
4.2字段
4.3屬性
4.3.1常規(guī)屬性
4.3.2自動(dòng)屬性
4.4索引器
4.5方法
4.5.1方法的定義與使用
4.5.2變量作用域
4.5.3方法重載
4.5.4參數(shù)的個(gè)數(shù)不定問(wèn)題——params
4.5.5ref與out
4.5.6this
4.6Main()函數(shù)
4.7構(gòu)造函數(shù)
4.8static
4.9析構(gòu)函數(shù)
4.10委托
4.10.1委托使用三步曲
4.10.2多播委托
4.11匿名方法
4.12Lambda表達(dá)式
4.13事件
4.13.1事件使用三步曲
4.13.2三類事件
4.14繼承
4.14.1繼承的實(shí)現(xiàn)
4.14.2抽象類及抽象方法
4.14.3類的密封
4.14.4繼承過(guò)程中構(gòu)造函數(shù)的執(zhí)行順序及調(diào)用
4.14.5protected修飾符
4.15多態(tài)
4.16接口
4.17匿名類型
4.18結(jié)構(gòu)
4.18.1DateTime
4.18.2TimeSpan
4.19object類
4.19.1相等問(wèn)題
4.19.2GetType()
4.19.3ToString()
4.20問(wèn)與答
4.20.1什么是命名空間
4.20.2readonly與const究竟有何區(qū)別
4.20.3什么是分部類
4.20.4密封類的擴(kuò)展——擴(kuò)展方法
4.20.5is和as——兼談如何讓singer不要調(diào)用基類方法
4.20.6重寫與重載
4.20.7抽象方法和虛方法
4.20.8接口、抽象類、類與結(jié)構(gòu)
4.20.9接口中有重名的方法該如何辦
4.20.10base與this
4.20.11什么是運(yùn)算符重載
4.20.12如何給自定義的結(jié)構(gòu)定義相等邏輯
4.21思考與練習(xí)
4.22實(shí)戰(zhàn)任務(wù)
第5章數(shù)組
5.1聲明及初始化
5.2訪問(wèn)與遍歷
5.3Array
5.4聰明的數(shù)組——索引器
5.5問(wèn)與答
5.5.1如何使用Array.Sort()來(lái)排序?qū)ο髷?shù)組
5.5.2數(shù)組的大小真的沒(méi)法調(diào)整嗎
5.5.3如何查找數(shù)組中具有特定特征的元素
5.5.4索引器的參數(shù)類型一定要為int嗎
5.5.5如何不計(jì)算即可獲得最大值、最小值、和值、平均值
5.6思考與練習(xí)
5.7實(shí)戰(zhàn)任務(wù)
第6章字符串
6.1字符串及其轉(zhuǎn)義符
6.1.1字符串及其構(gòu)造
6.1.2字符轉(zhuǎn)義
6.2常用方法
6.2.1string類的方法
6.2.2字符串對(duì)象的方法
6.3StringBuilder
6.4編碼
6.5問(wèn)與答
6.5.1s=null,s=string.Empty與s =\"\"
6.5.2字符串與數(shù)組之間如何互相轉(zhuǎn)化
6.5.3字符串與字節(jié)數(shù)組之間的轉(zhuǎn)換有何意義
6.5.4各種編碼之間如何轉(zhuǎn)換
6.6思考與練習(xí)
6.7實(shí)戰(zhàn)任務(wù)
第7章WinForm初步
7.1窗體
7.2控件常用操作及其鍵盤和鼠標(biāo)事件
7.2.1控件常用操作
7.2.2鍵盤事件處理
7.2.3鼠標(biāo)事件處理
7.3基本控件
7.3.1Label控件
7.3.2Button控件
7.3.3RadioButton控件
7.3.4CheckBox控件
7.3.5TextBox控件
7.3.6ListBox控件
7.3.7ComboBox控件
7.3.8PictureBox控件
7.3.9NumericUpDown控件
7.3.10ProgressBar控件
7.3.11HScrollBar控件和VScrollBar控件
7.3.12TrackBar控件
7.3.13ToolTip控件
7.3.14GroupBox控件
7.3.15Panel控件
7.3.16MonthCalendar控件
7.4常用組件
7.4.1Timer組件
7.4.2ImageList組件
7.5菜單
7.5.1MenuStrip
7.5.2ContextMenuStrip
7.5.3ToolStrip
7.5.4StatusStrip
7.6對(duì)話框
7.6.1OpenFileDialog
7.6.2SaveFileDialog
7.6.3FontDialog
7.6.4ColorDialog
7.6.5FolderBrowserDialog
7.7高級(jí)控件
7.7.1RichTextBox控件
7.7.2CheckedListBox控件
7.7.3TabControl控件
7.7.4ListView控件
7.7.5TreeView控件
7.7.6WebBrowser控件
7.8COM組件
7.8.1Shockwave Flash Object組件
7.8.2Windows Media Player組件
7.9MDI
7.10問(wèn)與答
7.10.1鍵盤事件KeyDown、KeyUp和KeyPress有何關(guān)系
7.10.2Click和MouseClick有何關(guān)系
7.10.3多種鼠標(biāo)事件有何關(guān)系
7.10.4如何獲取應(yīng)用程序的運(yùn)行環(huán)境信息
7.10.5如何獲取應(yīng)用程序的運(yùn)行目錄
7.10.6如何實(shí)現(xiàn)拖放
7.10.7關(guān)于剪貼板
7.10.8如何動(dòng)態(tài)構(gòu)建控件樹(shù)
7.10.9如何實(shí)現(xiàn)窗體間的數(shù)據(jù)交互
7.11思考與練習(xí)
7.12實(shí)戰(zhàn)任務(wù)
第8章文件
8.1文件系統(tǒng)
8.1.1驅(qū)動(dòng)器訪問(wèn)
8.1.2目錄訪問(wèn)
8.1.3文件訪問(wèn)
8.1.4路徑
8.2文件處理流
8.2.1FileStream
8.2.2StreamReader與StreamWriter
8.2.3BinaryReader與BinaryWriter
8.3問(wèn)與答
8.3.1如何創(chuàng)建臨時(shí)文件
8.3.2如何比較兩個(gè)文件是否一樣
8.4思考與練習(xí)
8.5實(shí)戰(zhàn)任務(wù)
第9章集合
9.1普通集合
9.1.1ArrayList
9.1.2Queue
9.1.3Stack
9.1.4Hashtable
9.1.5SortedList
9.1.6BitArray
9.2泛型
9.3泛型集合
9.3.1ListT
9.3.2QueueT和StackT
9.3.3DictionaryK,V和KeyValuePairK, V
9.3.4SortedListK,V
9.3.5HashSetT
9.4問(wèn)與答
9.4.1集合中的元素應(yīng)該如何正確刪除
9.4.2如何使用內(nèi)置排序器來(lái)實(shí)現(xiàn)ArrayList排序——IComparer
9.4.3如何完全自定義排序規(guī)則來(lái)排序
9.4.4IEnumerable和IEnumerator有什么作用和特性
9.4.5什么是可空類型
9.4.6什么是Tuple
9.4.7泛型變量的默認(rèn)值是多少
9.4.8針對(duì)如下泛型方法,下面的調(diào)用代碼可行嗎
9.4.9泛型的比較問(wèn)題
9.4.10HashSetT的擴(kuò)展方法
9.4.11集合的運(yùn)算
9.5思考與練習(xí)
9.6實(shí)戰(zhàn)任務(wù)
第10章GDI+
10.1概述
10.2輔助繪圖對(duì)象
10.2.1Point結(jié)構(gòu)
10.2.2Size結(jié)構(gòu)
10.2.3Rectangle結(jié)構(gòu)
10.2.4Color結(jié)構(gòu)
10.2.5Font類
10.2.6Graphics類
10.3基本繪圖工具
10.3.1Pen
10.3.2Brush
10.4圖像處理
10.4.1繪制直線
10.4.2繪制矩形
10.4.3繪制多邊形
10.4.4繪制曲線
10.4.5繪制橢圓
10.4.6繪制圖像
10.5常見(jiàn)應(yīng)用
10.5.1格式轉(zhuǎn)換
10.5.2水印
10.5.3灰化
10.5.4底片
10.5.5浮雕
10.5.6文本打印
10.6問(wèn)與答
10.6.1如何實(shí)現(xiàn)網(wǎng)頁(yè)顏色與Color的轉(zhuǎn)換
10.6.2Math類
10.7思考與練習(xí)
10.8實(shí)戰(zhàn)任務(wù)
第11章多線程
第12章序列化
第13章壓縮與解壓
第14章SQL
第15章ADO.NET
第3章程 序 控 制
一個(gè)合理實(shí)用的程序,不可能是從頭至尾一行一行地依次順序執(zhí)行的。程序的執(zhí)行順序在更多的場(chǎng)合應(yīng)該適當(dāng)?shù)剡M(jìn)行改變。這種改變程序從第一行依次順序執(zhí)行到最后一行的機(jī)制即稱為程序控制。程序控制語(yǔ)句有3類: 選擇語(yǔ)句、循環(huán)語(yǔ)句和跳轉(zhuǎn)語(yǔ)句。這3類語(yǔ)句構(gòu)成了由簡(jiǎn)單語(yǔ)句搭建程序大廈的基石。
3.1選 擇 語(yǔ) 句
選擇語(yǔ)句有if語(yǔ)句和switch語(yǔ)句,其中尤其以if語(yǔ)句最為常見(jiàn)。
3.1.1if語(yǔ)句
if語(yǔ)句是最基本最常見(jiàn)的程序流程控制語(yǔ)句。if可以配合else或者else if來(lái)無(wú)限擴(kuò)展選擇執(zhí)行的分支,當(dāng)然在實(shí)際編碼過(guò)程中,不會(huì)寫很多的if和else if。if語(yǔ)句可能會(huì)有如下幾種使用形式。無(wú)論采用下面的哪種方式,即使分支再多,最多也只會(huì)有一個(gè)分支獲得運(yùn)行。
(1) 一個(gè)分支: if (條件) {語(yǔ)句序列; }。
。2) 兩個(gè)分支: if (條件) {語(yǔ)句序列; } else {語(yǔ)句序列; }。
。3) 多分支: if (條件) {語(yǔ)句序列; } else if {語(yǔ)句序列; }…else {語(yǔ)句序列; }。
。4) 嵌套: if (條件){ if語(yǔ)句序列;} else { if語(yǔ)句序列;}。
其執(zhí)行機(jī)制是: 判斷各個(gè)條件,哪個(gè)條件成立則執(zhí)行哪個(gè)分支相應(yīng)的語(yǔ)句序列。若所有的條件都不成立,則直接執(zhí)行整個(gè)if塊后的語(yǔ)句。
例如,若有一語(yǔ)音播報(bào)程序,當(dāng)獲知客戶的性別為男時(shí),可以輸出“先生,你好!”,反之如果是女士時(shí),則輸出“女士,你好!”。則可能的參考代碼如下。
Console.Write(\"請(qǐng)輸入您的性別: \");
string sSex=Console.ReadLine();
if (sSex==\"男\(zhòng)")
Console.WriteLine(\"先生,你好!\");
else
Console.WriteLine(\"女士,你好!\");
上面的程序即采用的形式(2),如果能按照預(yù)期輸入,程序運(yùn)行自然良好。程序執(zhí)行結(jié)果如圖31所示。
但是若用戶隨便輸入,只要不輸入“男”,則上面的程序都將把客戶視為女性,自然不合理。例如如圖32所示的輸出。
圖31兩分支的if語(yǔ)句——正常執(zhí)行
圖32兩分支的if語(yǔ)句——不正常執(zhí)行
所以可以稍加修改,改善后的代碼如下:
Console.Write(\"請(qǐng)輸入您的性別: \");
string sSex=Console.ReadLine();
if (sSex==\"男\(zhòng)")
Console.WriteLine(\"先生,你好!\");
else if(sSex==\"女\")
Console.WriteLine(\"女士,你好!\");
else
Console.WriteLine(\"對(duì)不起,你是人妖吧?!\");
此代碼即形式(3)。
另外,為了給客戶的提醒更具體點(diǎn),比如根據(jù)當(dāng)前時(shí)間,顯示早上好、中午好、下午好、晚上好等比較具體的問(wèn)候語(yǔ),則可以編寫如下代碼:
//如下僅考慮上午好和下午好兩種問(wèn)候; 并且如下關(guān)于時(shí)間的判斷并不對(duì),此處僅為演示之用,聰明的您可以將其修改的更加合理。
//其中DateTime.Now.Hour是用來(lái)獲取當(dāng)前時(shí)間的小時(shí)部分
Console.Write(\"請(qǐng)輸入您的性別: \");
string sSex=Console.ReadLine();
if (sSex==\"男\(zhòng)")
{
if(DateTime.Now.Hour>12)
Console.WriteLine(\"先生,下午好!\");
else
Console.WriteLine(\"先生,上午好!\");
}
else if(sSex==\"女\")
{
if(DateTime.Now.Hour>12)
Console.WriteLine(\"女士,下午好!\");
else
Console.WriteLine(\"女士,上午好!\");
}
else
Console.WriteLine(\"對(duì)不起,輸入有誤!\");
觀察上面的代碼,不難發(fā)現(xiàn),此即形式(4),即if的嵌套使用。
課堂練習(xí):
請(qǐng)編寫一個(gè)程序,根據(jù)用戶輸入的分?jǐn)?shù),來(lái)輸出其分?jǐn)?shù)是優(yōu)秀、良好、中等、及格或者不及格(分級(jí)可以根據(jù)平時(shí)百分制的常規(guī)分級(jí)認(rèn)定)。
3.1.2switch語(yǔ)句
switch語(yǔ)句與if語(yǔ)句一樣,也是在眾多分支中選擇一個(gè)匹配的分支來(lái)執(zhí)行。然而兩者并不是完全一樣,并且在更多的情況下,對(duì)程序編碼人員來(lái)說(shuō),用if語(yǔ)句會(huì)更習(xí)慣些。
其語(yǔ)法形式如下:
……