基礎
.NET概述
參考:http://www.cnblogs.com/yplong/p/3279934.html
什么是.NET框架
.NET框架(.NET
Framework)是由微軟開發(fā)平挑,一個軟件開發(fā)平臺京景。
.NET框架是以一種采用系統(tǒng)虛擬機運行的編程平臺蛀序,以公共語言運行時(Common Language Runtime)為基礎,支持多種語言(C#醒第、VB.NET胸蛛、C++、Python等)的開發(fā)。
.NET Framework具有兩個主要組件:公共語言運行庫和.NET Framework類庫更哄。
.NET框架結(jié)構(gòu)圖
語言
Visual Studio .NET自身包含四種語言:Visual
Basic、Visual C++腥寇、Visual C#和JScript成翩。然而,.NET框架的模塊化特性使得由第三方創(chuàng)作的其他語言也可以集成到Visual Studio .NET中赦役。此類語言有20多種麻敌,包括Perl、Component Pascal掂摔、SmallScript和Smalltalk术羔。
公共語言規(guī)范
此規(guī)范是實現(xiàn).NET框架的所有語言的基礎,定義了公共類型系統(tǒng)的標準和所有語言必須實現(xiàn)的功能乙漓。這是第三方語言與框架集成的基礎级历。
Windows窗體
所有語言都共享公共Windows窗體引擎。窗體設計器在所有語言中都是一致的叭披,因此所有語言都可以訪問提供相同屬性和方法的相同固有控件寥殖。即使使用不同的語言開發(fā),其界面也都具有相同的外觀涩蜘。
ASP.NET
這是Web窗體和XML Web services的基礎技術(shù)嚼贡。Web窗體用于前端Web開發(fā),而XML Web services通過Intranet或Internet提供相應的功能同诫。
數(shù)據(jù)管理
ADO.NET代替ADO作為.NET框架中的數(shù)據(jù)處理機制粤策,它是使用XML進行數(shù)據(jù)傳輸?shù)母叨瓤缮炜s技術(shù)。
基類庫
這些類提供了一致且易于使用的方法剩辟,用于訪問各種信息(例如,系統(tǒng)信息、用戶信息等)贩猎,而以前要訪問這些信息熊户,必須使用特殊的組件或API。
公共語言運行時(CLR)
CLR為編譯器提供了托管執(zhí)行環(huán)境和編譯服務吭服。CLR編譯器將源代碼編譯成中間語言(IL)嚷堡,然后再以實時(JIT)方式執(zhí)行IL。所有源語言都共享CLR艇棕,并編譯成相同的IL蝌戒。
什么是公共語言架構(gòu)
通用語言架構(gòu)(Common Language Infrastructure,簡稱CLI)是一個開放的技術(shù)規(guī)范沼琉。
CLI有時候會和CLR混用北苟。但嚴格意義上說,這是錯誤的打瘪。因為CLI是一種規(guī)范友鼻,而CLR則是對這種規(guī)范的一個實現(xiàn)。
CLI標準包包含以下更詳細的規(guī)范
l通用類型系統(tǒng)(CommonType System, CTS)
l元數(shù)據(jù)系統(tǒng)(Metadata)
l通用語言規(guī)范(CommonLanguage Specification, CLS)
l虛擬執(zhí)行系統(tǒng)(VirtualExecution System, VES)
l通用中間語言(CommonIntermediate Language, CIL)
l框架(Framework)
適合CLI規(guī)范的程序都會被編譯成通用中間語言(CIL)闺骚,一種特殊的字節(jié)代碼彩扔。而不是能直接在你的電腦上運行的機器碼。
什么是公共語言運行時
通用語言運行庫(Common
Language Runtime僻爽,簡稱CLR)是微軟為他們的.NET的虛擬機所選用的名稱虫碉。這是通用語言架構(gòu)(簡稱CLI)的微軟實現(xiàn)版本,它定義了一個代碼運行的環(huán)境胸梆。CLR運行一種被稱為通用中間語言的字節(jié)代碼敦捧,這個是微軟的通用中間語言的實現(xiàn)版本。
CLR的主要功能如下
l基類庫支持BaseClass Libray Support
l存儲器管理MemoryManagement
l線程管理ThreadManagement
l存儲器自動回收Garbage Collection
l安全性Security
l類型檢查TypeChecker
l例外管理Exception Manager
l除錯管理DebugEngine
l中間碼(MSIL)到機器碼(Native)編譯
l類型裝載ClassLoader
開發(fā)人員使用高級編程語言撰寫程序乳绕。接下來編譯器將代碼編譯成微軟的中間語言(CIL)绞惦。之后在執(zhí)行過程中CLR會將CIL編譯為操作系統(tǒng)的原生碼(Native code)從而執(zhí)行。CLR自帶有實時編譯器(JIT)洋措。
CLR運行在windows上济蝉。查看通用語言架構(gòu)可以找到該規(guī)格的實現(xiàn)版本列表。其中有一些版本是運行在非Windows的操作系統(tǒng)中菠发。
什么是中間語言
通用中間語言(Common Intermediate Language王滤,簡稱CIL,原名叫做MSIL)是一種屬于公共語言規(guī)范和.NET框架的低階(lowest-level)的人類可讀的編程語言滓鸠,一種特殊的字節(jié)代碼雁乡。CIL類似一個面向?qū)ο蟮膮R編語言,并且它是完全基于堆棧的糜俗。面向.NET框架的語言都會被各自的編譯器編譯為中間語言(CIL)踱稍,運行時再經(jīng)由特定的編譯器(JIT編譯器曲饱,Just In tIME,JITer)編譯為機器代碼,以供操作系統(tǒng)執(zhí)行珠月。
什么是托管代碼
所有.NET語言都可以編寫面向CLR的程序代碼扩淀,這種代碼在.NET中被稱為托管代碼(Managed
Code),所有的Managed Code都直接運行在CLR上
簡單點說就是:所有運行在CLR上的代碼就叫做托管代碼啤挎,具有與平臺無關(guān)的特性驻谆。
什么是程序集
程序集:顧名思義就是一個集合。
其中包括了:
l程序清單
描述了程序集的版本庆聘,語言文化胜臊,發(fā)布者,共有導出類型伙判,以及組成該程序集的所有文件象对。
l元數(shù)據(jù)
提供有關(guān)程序集中定義的類型的信息,包括類型的名稱澳腹,可見性织盼,基類和類型所實現(xiàn)的接口。注意:程序集清單和元數(shù)據(jù)說明了程序集是自我描述的酱塔。
lCIL:中間語言
程序集有兩種:
一種是可執(zhí)行的應用程序文件(.exe擴展名文件)
一種是供其他應用程序使用的庫(.dll擴展名文件)
編譯器生成的中間語言(CIL)就被封裝在程序集中唐全,該程序集中包含了描述你所創(chuàng)建的類,方法和屬性(例如安全需求)的所有元數(shù)據(jù)蕊玷。你可以拷貝這個程序集到另一臺服務器上部署它邮利。
C#與.NET的關(guān)系
C#是一個程序設計語言,僅僅是一個語言垃帅,是.NET框架中眾多開發(fā)語言中的一種延届。
C#程序的開發(fā)執(zhí)行流程
1)編寫C#源程序(.cs)
2)通過編譯器編譯生成(.dll或.exe)
3)通過CLR運行,將CIL實時編譯編譯為機器碼贸诚,運行
HelloWorld案例的編寫和運行
(1)定義類
(2)寫main方法
(3)寫輸出語句
(4)C#程序開發(fā)運行與工作原理
(5)編譯和運行程序
---------------------------------------------------------------------------
classHelloWorld {
public static void Main(string[] args) {
Console.WriteLine("HelloWorld");
}
}
---------------------------------------------------------------------------
(1)程序解釋:
A:C#程序的最基本單位是類方庭,所以我們要定義一個類。
格式:class類名
舉例:classHelloWorld
B:在類中寫內(nèi)容的時候酱固,用大括號括起來械念。
C:C#程序要想執(zhí)行,必須有Main方法运悲。
格式:publicstatic void Main(String[] args)
D:要指向那些東西呢龄减,也用大括號括起來。
E:你要做什么呢?今天我們僅僅做了一個簡單的輸出
格式:Console.WriteLine("HelloWorld");
注意:""里面的內(nèi)容是可以改動的班眯。
常見的問題
lC#語言嚴格區(qū)分大小寫希停,請注意烁巫。
l見到非法字符:
\65307肯定是中文問題。我們寫程序要求標點符號必須全部是英文狀態(tài)宠能。
l括號的配對問題程拭。一般來說,括號都是成對出現(xiàn)的棍潘。
l遇到在類HelloWorld中找不到主方法,肯定是主方法的格式問題崖媚。
標識符
1)就是給類亦歉,接口,方法畅哑,變量等起名字時使用的字符序列
2)組成規(guī)則:
A.英文字母
B.數(shù)字
C.下劃線(_)
3)注意事項
A.不能包含空格和其他字符
B.不能以數(shù)字開頭
C.不能是C#中的關(guān)鍵字
D.區(qū)分大小寫
4)常見的命名規(guī)則
A.命名空間
單級命名空間:首字母大寫
舉例:System
多級命名空間:每個單詞首字母大寫(駝峰)肴楷,并用.隔開
舉例:System.Text
B.類或者接口
一個單詞:首字母大寫
舉例:Console
多個單詞:每個單詞首字母大寫(駝峰)
舉例:HelloWorld,StudentName
C.變量
一個單詞:小寫
舉例:num
多個單詞:第一個單詞小寫荠呐,從第二個單詞開始赛蔫,每個單詞首字母大寫
舉例:myName
D.屬性、方法
一個單詞:首字母大寫
舉例:Name
多個單詞:每個單詞首字母大寫
舉例:GetName
E.常量
一個單詞:全部大寫
舉例:AGE
多個單詞:全部大寫泥张,并用_隔開
舉例:YOUR_AGE
注釋
1)就是對程序進行解釋說明的文字
2)分類:
A:單行注釋//
B:多行注釋/**/
C:文檔注釋(后面講) /** */
3)注釋的作用
A:解釋說明程序呵恢,提高了代碼的閱讀性。
B:可以幫助我們調(diào)試程序媚创。
后面我們會講解一個更高端的一個調(diào)試工具
常量
1)在程序執(zhí)行的過程中渗钉,其值不發(fā)生改變的量
2)常量可以是任何基本數(shù)據(jù)類型
3)分類:
A:字面值常量
B:自定義常量(后面講)
4)字面值常量
A.字符串常量"hello"
B.整數(shù)常量12,23
C.小數(shù)常量12.345
D.字符常量'a','A','0'
E.布爾常量true,false
F.空常量null(后面講)
G.等等……
5)在C#中針對整數(shù)常量提供了四種表現(xiàn)形式
A.二進制由0,1組成钞钙。以0b開頭鳄橘。
B.八進制由0,1芒炼,...7組成瘫怜。以0開頭。
C.十進制由0本刽,1鲸湃,...9組成。整數(shù)默認是十進制盅安。
D.十六進制由0唤锉,1,...9,a,b,c,d,e,f(大小寫均可)組成别瞭。以0x開頭窿祥。
進制轉(zhuǎn)換(了解)
1)其他進制到十進制s
系數(shù):就是每一個位上的數(shù)值
基數(shù):x進制的基數(shù)就是x
權(quán):對每一個位上的數(shù)據(jù),從右蝙寨,并且從0開始編號晒衩,對應的編號就是該數(shù)據(jù)的權(quán)嗤瞎。
結(jié)果:系數(shù)*基數(shù)^權(quán)次冪之和。
2)十進制到其他進制
除基取余听系,直到商為0贝奇,余數(shù)反轉(zhuǎn)。
3)進制轉(zhuǎn)換的快速轉(zhuǎn)換法
A.十進制和二進制間的轉(zhuǎn)換
8421碼靠胜。
128掉瞳、64、32浪漠、16陕习、8、4址愿、2该镣、1
B.二進制到八進制,十六進制的轉(zhuǎn)換
原碼反碼補碼(了解)
1)為什么要學習原碼反碼補碼?
后面要學習強制類型轉(zhuǎn)換,如果不知道有原反補會看不懂結(jié)果
2)有符號數(shù)據(jù)表示法的幾種方式
A.原碼
就是二進制定點表示法响谓,即最高位為符號位损合,“0”表示正,“1”表示負娘纷,其余位表示數(shù)值的大小嫁审。
通過一個字節(jié),也就是8個二進制位表示+7和-7
0(符號位)0000111
1(符號位)1000111
B.反碼
正數(shù)的反碼與其原碼相同;負數(shù)的反碼是對其原碼逐位取反赖晶,但符號位除外土居。
C.補碼
正數(shù)的補碼與其原碼相同;負數(shù)的補碼是在其反碼的末位加1嬉探。
3)練習
A.已知原碼求補碼
0b10110100
B.已知補碼求原碼
0b11101110
變量
1)在程序的執(zhí)行過程中擦耀,其值在某個范圍內(nèi)可以發(fā)生改變的量
2)變量的定義格式:
A.數(shù)據(jù)類型變量名=初始化值;
B.數(shù)據(jù)類型變量名;
變量名=初始化值;
3)使用變量的注意事項:
A.作用域
變量定義在哪一級大括號中,哪個大括號的范圍就是這個變量的作用域涩堤。相同的作用域中不能定義兩個同名變量眷蜓。
B.初始化值
局部變量在使用之前必須賦值
C.一條語句可以定義多個變量(不建議)
inta,b,c...;
數(shù)據(jù)類型
首先要了解一點:C#認可的基礎數(shù)據(jù)類型并沒有內(nèi)置于C#語言中,而是內(nèi)置于.net Framework中(CTS)胎围。
如吁系,在c#中聲明一個int類型的數(shù)據(jù)時,聲明的實際上是.net結(jié)構(gòu)System.Int32的一個實例白魂。這聽起來似乎很深奧汽纤,但其意義深遠:這表示在語法上,可以把所有的基礎數(shù)據(jù)類型看作是支持某些方法的類福荸。
類型實際上仍存儲為基本類型蕴坪。基本類型在概念上用.Net結(jié)構(gòu)表示,所以肯定沒有性能損失背传。
1)C#是一種強類型語言呆瞻,針對每種數(shù)據(jù)都提供了對應的數(shù)據(jù)類型,在內(nèi)存中分配了不同大小的內(nèi)存空間
2)分類:
A.基本數(shù)據(jù)類型:4類8種
B.引用數(shù)據(jù)類型:string径玖,Dynamic痴脾,類租冠,接口艘儒,數(shù)組,指針通砍。
3)基本數(shù)據(jù)類型
A.整數(shù)CTS占用字節(jié)數(shù)
byteSystem.Byte1
shortSystem.Int162
intSystem.Int324
longSystem.Int648
B.浮點數(shù)
floatSystem.Single4
doubleSystem.Double8
C.字符
charSystem.Char2
D.布爾
boolSystem.Boolean1
注意:
整數(shù)默認是int類型冤灾,浮點數(shù)默認是double薯定。
長整數(shù)要加L或者l。
單精度的浮點數(shù)要加F或者f瞳购。
4)char數(shù)據(jù)類型特點(掌握)
A.char c = (char)97;//結(jié)果為'a',char范圍0到65535
B.C#語言中的字符char可以存儲一個中文漢字嗎?為什么呢?
可以亏推。因為在.NET里学赛,類型System.Char代表一個Unicode字符。
Unicode編碼中的每個字符占用兩個字節(jié)吞杭。中文也是占的兩個字節(jié)盏浇。
所以,C#中的字符可以存儲一個中文漢字芽狗。
數(shù)據(jù)類型轉(zhuǎn)換
1)bool類型不參與轉(zhuǎn)換
2)默認轉(zhuǎn)換
A.從小到大
B.byte,short,char -- int -- long-- float -- double
C.byte,short,char之間不相互轉(zhuǎn)換绢掰,直接轉(zhuǎn)成int類型參與運算。其他類型進行混合運算的是小的數(shù)據(jù)類型提升為大的
3)強制轉(zhuǎn)換
A.從大到小
B.可能會有精度的損失童擎,一般不建議這樣使用滴劲。
C.格式:
目標數(shù)據(jù)類型變量名= (目標數(shù)據(jù)類型) (被轉(zhuǎn)換的數(shù)據(jù));
D.例子:
int a = 10;
byte b = 20;
b = (byte)(a + b);
4)思考題和面試題:
A.下面兩種方式有區(qū)別嗎?
float f1 = 12.345f;
float f2 = (float)12.345;//有精度損失
B.下面的程序有問題嗎,如果有顾复,在哪里呢?
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;//byte類型的變量在進行運算的時候,會自動類型提升為int類型(報錯)
byte b4 = 3 + 4;//3和4都是常量班挖,C#有常量優(yōu)化機制,就是在編譯的的時候直接把3和4的結(jié)果賦值給b4了
C.下面的操作結(jié)果是什么呢?
byte b = (byte)130;//byte的范圍-128-127芯砸,
JAVA里一個byte取值范圍是-128~127,所以結(jié)果會是-126
而C#里一個byte取值范圍是0~255萧芙,所以結(jié)果還是130
D.字符參與運算
是查找ASCII里面的值
'a'97
'A'65
'0'48
Console.WriteLine('a');//97
Console.WriteLine('a'+ 1);//98
E.字符串參與運算
這里其實是字符串的連接
Console.WriteLine ("hello" + 'a' + 1);
Console.WriteLine ('a + 1 + "hello");
Console.WriteLine ("5 + 5 = " + 5 + 5);
Console.WriteLine (5 + 5 + "= 5 + 5");
運算符
1)算術(shù)運算符
A.+,-假丧,*双揪,/,%包帚,++渔期,--
B.+的用法
a)加法
b)正號
c)字符串連接符
A./和%的區(qū)別
數(shù)據(jù)做除法操作的時候,/取得是商渴邦,%取得是余數(shù)
B.%運算符的特點
當左邊的絕對值小于右邊絕對值時,結(jié)果是左邊
當左邊的絕對值等于右邊或是右邊的倍數(shù)時,結(jié)果是0
當左邊的絕對值大于右邊絕對值時,結(jié)果是余數(shù)
%運算符結(jié)果的符號只和左邊有關(guān)系,與右邊無關(guān)
任何一個正整數(shù)%2結(jié)果不是0就是1可以用來當作切換條件
C.++和--的用法
a)他們的作用是自增或者自減
b)使用
**單獨使用
放在操作數(shù)據(jù)的前面和后面效果一樣擎场。
a++或者++a效果一樣羽德。
**參與操作使用
放在操作數(shù)的前面:先自增或者自減,再參與操作
inta = 10;
intb = ++a;
放在操作數(shù)的后面:先參與操作迅办,再自增或者自減
inta = 10;
intb = a++;
a)練習
(1)請分別計算出a,b,c的值?
int a = 10;
int b = 10;
int c = 10;
a= b++;
c= --a;
b= ++a;
a= c--;
答案:a:9宅静,b:10,c:8
(2)請分別計算出x,y的值?
int x = 4;
//4//6//60
int y =(x++)+(++x)+(x*10);
答案:x:6站欺,y:70
2)賦值運算符
A.=,+=,-=,*=,/=,%=等
B.=叫做賦值運算符姨夹,也是最基本的賦值運算符
int x = 10;把10賦值給int類型的變量x。
C.擴展的賦值運算符的特點
隱含了自動強制轉(zhuǎn)換矾策。
D.面試題:
short s = 1;
s= s + 1;//報錯磷账,改為s = (s的數(shù)據(jù)類型)(s +1);
shorts = 1;
s+= 1;//等價于s = (s的數(shù)據(jù)類型)(s +1);
請問上面的代碼哪個有問題?
3)比較運算符
A.==,!=,>,>=,<,<=
B.無論運算符兩端簡單還是復雜最終結(jié)果是boolean類型贾虽。
C.千萬不要把==寫成了=
4)邏輯運算符
A.&,|,^,!,&&,||
B.邏輯運算符一般用于連接boolean類型的表達式或者值逃糟。
C.表達式:
就是用運算符把常量或者變量連接起來的符合java語法的式子。
算術(shù)表達式:a + b
比較表達式:a == b(條件表達式)
D.結(jié)論
&:有false則false
|:有true則true
^:相同則false蓬豁,不同則true绰咽。//情侶關(guān)系。
!:非true則false地粪,非false則true
&&:結(jié)果和&是一樣的取募,只不過有短路效果。左邊是false蟆技,右邊不執(zhí)行玩敏。
||:結(jié)果和|是一樣的,只不過有短路效果质礼。左邊是true旺聚,右邊不執(zhí)行。
5)位運算符(了解)
&,|,^,~ ,>>,>>>,<<
A.位運算符的特點
都是針對補碼進行操作的
B.結(jié)論:
&(位與):有0則0
|(位或):有1則1
^(位異或):相同則0眶蕉,不同則1
~:按位取反
<<:左移左邊最高位丟棄翻屈,右邊補齊0
>>:右移最高位是0,左邊補齊0;最高為是1妻坝,左邊補齊1
>>>:無符號右移無論最高位是0還是1伸眶,左邊補齊0
C.^的特殊用法
一個數(shù)據(jù)針對另一個數(shù)據(jù)位異或兩次,該數(shù)不變
D.面試題
a)請實現(xiàn)兩個變量的交換
**采用第三方變量
**用位異或運算符
左邊a,b,a
右邊a^b
b)請用最有效率的方式計算出2乘以8的結(jié)果
2<<3
6)三元運算符
A.格式
比較表達式?表達式1:表達式2;
B.執(zhí)行流程:
首先計算比較表達式的值刽宪,看是true還是false厘贼。
如果是true,表達式1就是結(jié)果圣拄。
如果是false嘴秸,表達式2就是結(jié)果。
C.案例:
a)比較兩個數(shù)據(jù)是否相等
b)獲取兩個數(shù)據(jù)中的最大值
c)獲取三個數(shù)據(jù)中的最大值
鍵盤錄入
1)實際開發(fā)中,數(shù)據(jù)是變化的岳掐,為了提高程序的靈活性凭疮,我們加入鍵盤錄入數(shù)據(jù)。
2)如何實現(xiàn)呢?目前就記住
引入命名空間
usingSystem;
位置:
可以是在namespace的上面或namespace里頭class上面
可以在class上面串述,沒有namespace的情況
獲取數(shù)據(jù)
Console.ReadLine();
3)把三元運算符的案例加入鍵盤錄入改進执解。
流程控制語句
1)順序結(jié)構(gòu)
從上往下,依次執(zhí)行
2)選擇結(jié)構(gòu)
按照不同的選擇纲酗,執(zhí)行不同的代碼
3)循環(huán)結(jié)構(gòu)
做一些重復的代碼
if語句
1)三種格式
A.格式1
if(比較表達式) {
語句體;
}
執(zhí)行流程:
判斷比較表達式的值衰腌,看是true還是false
如果是true,就執(zhí)行語句體
如果是false觅赊,就不執(zhí)行語句體
B.格式2
if(比較表達式) {
語句體1;
}else{
語句體2;
}
執(zhí)行流程:
判斷比較表達式的值右蕊,看是true還是false
如果是true,就執(zhí)行語句體1
如果是false吮螺,就執(zhí)行語句體2
C.格式3
if(比較表達式1) {
語句體1;
}elseif(比較表達式2){
語句體2;
}
...
else{
語句體n+1;
}
執(zhí)行流程:
判斷比較表達式1的值饶囚,看是true還是false
如果是true,就執(zhí)行語句體1
如果是false鸠补,就繼續(xù)判斷比較表達式2的值萝风,看是true還是false
如果是true,就執(zhí)行語句體2
如果是false莫鸭,就繼續(xù)判斷比較表達式3的值,看是true還是false
...
如果都不滿足横殴,就執(zhí)行語句體n+1
2)注意事項
A.比較表達式無論簡單還是復雜被因,結(jié)果是boolean類型
B.if語句控制的語句體如果是一條語句,是可以省略大括號的衫仑;如果是多條梨与,不能省略。建議:永遠不要省略文狱。
C.一般來說粥鞋,有左大括號,就沒有分號瞄崇,有分號呻粹,就沒有左大括號。
D.else后面如果沒有if苏研,是不會出現(xiàn)比較表達式的等浊。
E.三種if語句其實都是一個語句,只要有一個執(zhí)行摹蘑,其他的就不再執(zhí)行筹燕。
3)案例:
A.比較兩個數(shù)是否相等
B.獲取兩個數(shù)中的最大值
C.獲取三個數(shù)中的最大值(if語句的嵌套)
D.根據(jù)成績輸出對應的等級
E.根據(jù)月份,輸出對應的季節(jié)
F.根據(jù)x計算對應y的值并輸出
4)三元運算符和if語句第二種格式的關(guān)系
所有的三元運算符能夠?qū)崿F(xiàn)的,if語句的第二種格式都能實現(xiàn)撒踪。
反之不成立过咬。
如果if語句第二種格式控制的語句體是輸出語句,就不可以制妄。
因為三元運算符是一個運算符掸绞,必須要有一個結(jié)果返回,不能是一個輸出語句忍捡。
switch語句
1)格式:
switch(表達式) {
case值1:
語句體1;
break;
case值2:
語句體2;
break;
default:
語句體n+1;
break;
}
2)格式解釋說明:
switch:說明這是switch語句集漾。
表達式:與JAVA不同,在C#中可以是整數(shù)(byte,short,int,long)砸脊、char具篇、string、bool凌埂、enum
case:后面的值就是要和表達式進行比較的值
break:表示程序到這里中斷驱显,跳出switch語句
default:如果所有的情況都不匹配,就執(zhí)行這里,相當于if語句中的else
3)面試題
switch語句的表達式可以是byte嗎?可以是long嗎?可以是String嗎?
答:都可以。
4)執(zhí)行流程:
A.首先計算表達式的值
B.和每一個case進行匹配瞳抓,如果有就執(zhí)行對應的語句體埃疫,看到break就結(jié)束。
C.如果沒有匹配孩哑,就執(zhí)行default的語句體n+1栓霜。
5)注意事項:
A.case后面只能是常量,不能是變量横蜒,而且胳蛮,多個case后面的值不能出現(xiàn)相同的
B.default可以省略嗎?
可以省略,但是不建議丛晌,因為它的作用是對不正確的情況給出提示仅炊。
特殊情況:
case就可以把值固定。
A,B,C,D
C.break可以省略嗎?
與java不同澎蛛,在C#中不可以省略抚垄,C#中不允許出現(xiàn)case穿透。
但是可以多case:
switch (l)
{
case 4:
case 5:
Console.Write(4);
break;
}
D.default一定要在最后嗎?
不是谋逻,可以在任意位置呆馁。但是建議在最后。
E.switch語句的結(jié)束條件
(1)遇到break就結(jié)束了
注:與java不同毁兆,在C#中每個case或default中都必須有break
(2)執(zhí)行到末尾就結(jié)束了
6)案例:
A.鍵盤錄入一個數(shù)字(1-7),輸出對應的星期幾智哀。
B.單項選擇題
C.根據(jù)給定的月份,輸出對應的季節(jié)
7)if語句和switch語句各自的場景
A.if
針對boolean類型的判斷
針對一個范圍的判斷
針對幾個常量的判斷
B.switch
針對幾個常量的判斷
循環(huán)語句
1)有三種:for,while,do...while
2)for循環(huán)語句
A.格式
for(初始化語句;判斷條件語句;控制條件語句){
循環(huán)體語句;
}
執(zhí)行流程:
(1)執(zhí)行初始化語句
(2)執(zhí)行判斷條件語句
如果這里是true,就繼續(xù)
如果這里是false荧恍,循環(huán)就結(jié)束
(3)執(zhí)行循環(huán)體語句
(4)執(zhí)行控制條件語句
(5)回到b
B.注意事項
(1)判斷條件語句無論簡單還是復雜瓷叫,結(jié)果是boolean類型
(2)循環(huán)體語句如果是一條屯吊,可以省略大括號,但是不建議
(3)有分號就沒有左大括號摹菠,有左大括號就沒有分號
C.案例
(1)輸出10次HelloWorld
(2)輸出1-10的數(shù)據(jù)
(3)輸出10-1的數(shù)據(jù)
(4)求1-10的和
(5)求1-100的和,求1-100的偶數(shù)和,求1-100的奇數(shù)和
(6)求5的階乘
(7)在控制臺打印水仙花數(shù)
(8)統(tǒng)計水仙花個數(shù)
(9)改進版的回文數(shù)
一個五位數(shù)
個位=萬位
十位=千位
個位+十位+千位+萬位=百位
(10)統(tǒng)計1-1000之間同時滿足如下條件的數(shù)據(jù)有多少個
x%3==2
x%5==3
x%7==2
3)while循環(huán)
A.格式:
基本格式
while(判斷條件語句) {
循環(huán)體語句;
}
擴展格式:
初始化語句;
while(判斷條件語句){
循環(huán)體語句;
控制條件語句;
}
通過查看這個格式盒卸,我們就知道while循環(huán)可以和for循環(huán)等價轉(zhuǎn)換。
B.執(zhí)行流程:
(1)執(zhí)行初始化語句
(2)執(zhí)行判斷條件語句,看其返回值是true還是false
如果是true次氨,就繼續(xù)執(zhí)行
如果是false蔽介,就結(jié)束循環(huán)
(3)執(zhí)行循環(huán)體語句;
(4)執(zhí)行控制條件語句
(5)回到B繼續(xù)。
C.while的練習
把for語句的練習用while改進
D.for和while的區(qū)別
(1)使用上的區(qū)別
for語句的那個控制條件變量,在循環(huán)結(jié)束后不能在使用了煮寡。
而while的可以繼續(xù)使用虹蓄。
(2)理解上的區(qū)別
for適合于一個范圍的判斷
while適合次數(shù)不明確的
舉例:吃葡萄
E.案例:
(1)珠穆朗瑪峰問題
(2)小芳存錢問題(break以后才能做)
4)do...while循環(huán)
A.格式
基本格式
do{
循環(huán)體語句;
}while(判斷條件語句);
擴展格式:
初始化語句;
do{
循環(huán)體語句;
控制條件語句;
}while(判斷條件語句);
通過查看格式,我們就可以看出其實三種循環(huán)的格式可以是統(tǒng)一的幸撕。
B.執(zhí)行流程:
(1)執(zhí)行初始化語句
(2)執(zhí)行循環(huán)體語句;
(3)執(zhí)行控制條件語句
(4)執(zhí)行判斷條件語句,看其返回值是true還是false
如果是true薇组,就繼續(xù)執(zhí)行
如果是false,就結(jié)束循環(huán)
(5)回到b繼續(xù)坐儿。
5)三種循環(huán)語句的區(qū)別:
do...while循環(huán)至少執(zhí)行一次循環(huán)體律胀。
而for,while循環(huán)必須先判斷條件是否成立,然后決定是否執(zhí)行循環(huán)體語句貌矿。
6)循環(huán)使用的注意事項(死循環(huán))
A.一定要注意修改控制條件,否則容易出現(xiàn)死循環(huán)炭菌。
B.最簡單的死循環(huán)格式
(1)while(true){...}
(2)for(;;){}
7)練習:
A.請輸出一個4行5列的星星(*)圖案。如圖:
*****
*****
*****
*****
B.請輸出正三角形逛漫,如圖:
*
**
***
****
*****
C.在控制臺輸出九九乘法表黑低。
控制跳轉(zhuǎn)語句
1)break:中斷的意思
A.用在循環(huán)和switch語句中,離開此應用場景無意義酌毡。
B.作用
(1)跳出單層循環(huán)
(2)跳出多層循環(huán)克握,需要標簽語句的配合
2)continue:繼續(xù)
A.用在循環(huán)中,離開此應用場景無意義阔馋。
B.作用
跳出單層循環(huán)的一次玛荞,可以繼續(xù)下一次
C.填空題
for(intx=1; x<=10; x++) {
if(x%3== 0) {
//補齊代碼
}
Console.WriteLine("C#基礎班");
}
如何讓控制臺輸出2次:C#基礎班
如何讓控制臺輸出7次:C#基礎班
如何讓控制臺輸出13次:C#基礎班
3)標號+ goto:
A.作用
標記某個循環(huán)對其控制
B.組成規(guī)則
其實就是合法的標識符
C.例子:(跳出多層循環(huán))
------------------------------------------------------------------------
publicstaticvoidMain(string[] args)
{
for(inti = 0; i < 5;i++)
{
for(intj = 0; j < 5; j++)
{
if(j == 3)
gotook;
else{
Console.WriteLine("i="+ i +",j="+ j);
}
}
}
ok:
Console.WriteLine("goto");
}
------------------------------------------------------------------------
4)return:返回
用于結(jié)束方法的娇掏,后面還會在繼續(xù)講解和使用呕寝。
一旦遇到return,程序就不會在繼續(xù)往后執(zhí)行婴梧。
5)return和break以及continue的區(qū)別?
return是結(jié)束方法
break是跳出循環(huán)
continue是終止本次循環(huán)繼續(xù)下次循環(huán)
6)練習題:
for(intx=1; x<=10; x++) {
if(x%3==0) {
//在此處填寫代碼
}
Console.WriteLine(“C#基礎班”);
}
我想在控制臺輸出2次:“C#基礎班“
我想在控制臺輸出7次:“C#基礎班“
我想在控制臺輸出13次:“C#基礎班“
方法
1)方法:就是完成特定功能的代碼塊下梢,提高代碼的復用性。
注意:在很多語言里面有函數(shù)的定義塞蹭,而在Java中孽江,函數(shù)被稱為方法。
2)格式:
修飾符返回值類型方法名(參數(shù)類型參數(shù)名1,參數(shù)類型參數(shù)名2...) {
方法體語句;
return返回值;
}
3)格式說明:
修飾符:目前就用public static番电。后面再詳細講解其他修飾符
返回值類型:就是功能結(jié)果的數(shù)據(jù)類型
方法名:符合命名規(guī)則即可岗屏,方便我們調(diào)用該方法辆琅。
參數(shù)類型:就是參數(shù)的數(shù)據(jù)類型
參數(shù)名:就是變量
參數(shù)分類:
實參:實際參與運算的數(shù)據(jù)
形參:方法上定義的,用于接收實際參數(shù)的變量
方法體語句:就是完成功能的代碼塊
return:結(jié)束方法
返回值:就是功能的結(jié)果这刷,由return帶給調(diào)用者婉烟。
4)兩個明確:
返回值類型:結(jié)果的數(shù)據(jù)類型
參數(shù)列表:參數(shù)的個數(shù)及對應的數(shù)據(jù)類型
5)方法調(diào)用
A.有明確返回值的方法
(1)單獨調(diào)用,沒有意義
(2)輸出調(diào)用暇屋,不是很好似袁,因為我可能需要不結(jié)果進行進一步的操作。但是講課一般我就用了咐刨。
(3)賦值調(diào)用昙衅,推薦方案
B.void類型修飾的方法
單獨調(diào)用
6)方法的注意事項
A.方法不調(diào)用不執(zhí)行
B.方法之間是平級關(guān)系,不能嵌套定義
C.方法定義的時候定鸟,參數(shù)是用而涉,隔開的
D.方法在調(diào)用的時候,不用在傳遞數(shù)據(jù)類型
E.如果方法有明確的返回值類型仔粥,就必須有return語句返回婴谱。
7)案例:
A.求和方案
B.獲取兩個數(shù)中的較大值
C.比較兩個數(shù)據(jù)是否相同
D.獲取三個數(shù)中的最大值
E.輸出m行n列的星形
F.輸出nn乘法表
8)方法重載
A.在同一個類中,方法名相同躯泰,參數(shù)列表不同谭羔。與返回值無關(guān)。
B.參數(shù)列表不同:
(1)參數(shù)的個數(shù)不同麦向。
(2)參數(shù)的對應的數(shù)據(jù)類型不同瘟裸。
(3)參數(shù)的順序不同(算重載,但是在開發(fā)中不用)
9)方法重載案例
不同的類型的多個同名方法的比較。
數(shù)組
1)數(shù)組:存儲同一種數(shù)據(jù)類型的多個元素的容器诵竭,既可以存儲基本數(shù)據(jù)類型话告,也可以存儲引用數(shù)據(jù)類型。
2)特點:每一個元素都有編號卵慰,從0開始沙郭,最大編號是長度-1。
編號的專業(yè)叫法:索引
3)定義格式
數(shù)據(jù)類型[]數(shù)組名;
4)數(shù)組的初始化
就是為數(shù)組開辟連續(xù)的內(nèi)存空間裳朋,并為每個數(shù)組元素賦予值
A.動態(tài)初始化
只給長度病线,系統(tǒng)給出默認值
舉例:int[] arr= new int[3];
B.靜態(tài)初始化
給出值,系統(tǒng)決定長度
舉例:int[] arr= new int[]{1,2,3};
簡化版:int[] arr= {1,2,3};
5)數(shù)組操作的兩個常見小問題:
A.數(shù)組索引越界異常
原因:你訪問了不存在的索引鲤嫡。
B.空指針異常
原因:數(shù)組已經(jīng)不在指向堆內(nèi)存了送挑。而你還用數(shù)組名去訪問元素。
例子:
int[]arr = {1,2,3};
arr= null;
Console.WriteLine(arr[0]);
6)C#的內(nèi)存分配
A.棧存儲局部變量
B.堆存儲所有new出來的
C.方法區(qū)(面向?qū)ο蟛糠衷敿氈v解)
D.本地方法區(qū)(系統(tǒng)相關(guān))
E.寄存器(CPU使用)
注意:
a:局部變量在方法定義中或者方法聲明上定義的變量暖眼。
b:棧內(nèi)存和堆內(nèi)存的區(qū)別
棧:數(shù)據(jù)使用完畢惕耕,就消失。
堆:每一個new出來的東西都有地址
每一個變量都有默認值
byte,short,int,long0
float,double 0.0
char'\u0000'
booleanfalse
引用類型null
數(shù)據(jù)使用完畢后诫肠,在垃圾回收器空閑的時候回收司澎。
(7)數(shù)組內(nèi)存圖
A:一個數(shù)組
B:二個數(shù)組
C:三個數(shù)組(兩個棧變量指向同一個堆內(nèi)存)
(8)數(shù)組的常見操作
A:遍歷
---------------------------------------------------------------------------
方式1:
publicstatic void printArray(int[] arr) {
for(intx=0; x
System.out.println(arr[x]);
}
}
方式2:
publicstatic void printArray(int[] arr) {
System.out.print("[");
for(intx=0; x
if(x== arr.length-1) {
System.out.println(arr[x]+"]");
}else{
System.out.println(arr[x]+",");
}
}
}
---------------------------------------------------------------------------
B:最值
---------------------------------------------------------------------------
最大值:
publicstatic int getMax(int[] arr) {
intmax = arr[0];
for(intx=1; x
if(arr[x]> max) {
max= arr[x];
}
}
returnmax;
}
最小值:
publicstatic int getMin(int[] arr) {
intmin = arr[0];
for(intx=1; x
if(arr[x]< min) {
min= arr[x];
}
}
returnmin;
}
---------------------------------------------------------------------------
C:逆序
---------------------------------------------------------------------------
方式1:
publicstatic void reverse(int[] arr) {
for(intx=0; x
inttemp = arr[x];
arr[x]= arr[arr.length-1-x];
arr[arr.length-1-x]= temp;
}
}
方式2:
publicstatic void reverse(int[] arr) {
for(intstart=0,end=arr.length-1; start<=end; start++,end--) {
inttemp = arr[start];
arr[start]= arr[end];
arr[end]= temp;
}
}
---------------------------------------------------------------------------
D:查表
---------------------------------------------------------------------------
publicstatic String getString(String[] strArray,int index) {
returnstrArray[index];
}
---------------------------------------------------------------------------
E:基本查找
---------------------------------------------------------------------------
方式1:
publicstatic int getIndex(int[] arr,int value) {
for(intx=0; x
if(arr[x]== value) {
returnx;
}
}
return-1;
}
方式2:
publicstatic int getIndex(int[] arr,int value) {
intindex = -1;
for(intx=0; x
if(arr[x]== value) {
index= x;
break;
}
}
returnindex;
}
---------------------------------------------------------------------------