基礎
.NET概述
參考:http://www.cnblogs.com/yplong/p/3279934.html
什么是.NET框架
.NET框架(.NET
Framework)是由微軟開發,一個軟件開發平臺。
.NET框架是以一種采用系統虛擬機運行的編程平臺,以公共語言運行時(Common Language Runtime)為基礎,支持多種語言(C#、VB.NET、C++、Python等)的開發。
.NET Framework具有兩個主要組件:公共語言運行庫和.NET Framework類庫。
.NET框架結構圖
語言
Visual Studio .NET自身包含四種語言:Visual
Basic、Visual C++、Visual C#和JScript。然而,.NET框架的模塊化特性使得由第三方創作的其他語言也可以集成到Visual Studio .NET中。此類語言有20多種,包括Perl、Component Pascal、SmallScript和Smalltalk。
公共語言規范
此規范是實現.NET框架的所有語言的基礎,定義了公共類型系統的標準和所有語言必須實現的功能。這是第三方語言與框架集成的基礎。
Windows窗體
所有語言都共享公共Windows窗體引擎。窗體設計器在所有語言中都是一致的,因此所有語言都可以訪問提供相同屬性和方法的相同固有控件。即使使用不同的語言開發,其界面也都具有相同的外觀。
ASP.NET
這是Web窗體和XML Web services的基礎技術。Web窗體用于前端Web開發,而XML Web services通過Intranet或Internet提供相應的功能。
數據管理
ADO.NET代替ADO作為.NET框架中的數據處理機制,它是使用XML進行數據傳輸的高度可伸縮技術。
基類庫
這些類提供了一致且易于使用的方法,用于訪問各種信息(例如,系統信息、用戶信息等),而以前要訪問這些信息,必須使用特殊的組件或API。
公共語言運行時(CLR)
CLR為編譯器提供了托管執行環境和編譯服務。CLR編譯器將源代碼編譯成中間語言(IL),然后再以實時(JIT)方式執行IL。所有源語言都共享CLR,并編譯成相同的IL。
什么是公共語言架構
通用語言架構(Common Language Infrastructure,簡稱CLI)是一個開放的技術規范。
CLI有時候會和CLR混用。但嚴格意義上說,這是錯誤的。因為CLI是一種規范,而CLR則是對這種規范的一個實現。
CLI標準包包含以下更詳細的規范
l通用類型系統(CommonType System, CTS)
l元數據系統(Metadata)
l通用語言規范(CommonLanguage Specification, CLS)
l虛擬執行系統(VirtualExecution System, VES)
l通用中間語言(CommonIntermediate Language, CIL)
l框架(Framework)
適合CLI規范的程序都會被編譯成通用中間語言(CIL),一種特殊的字節代碼。而不是能直接在你的電腦上運行的機器碼。
什么是公共語言運行時
通用語言運行庫(Common
Language Runtime,簡稱CLR)是微軟為他們的.NET的虛擬機所選用的名稱。這是通用語言架構(簡稱CLI)的微軟實現版本,它定義了一個代碼運行的環境。CLR運行一種被稱為通用中間語言的字節代碼,這個是微軟的通用中間語言的實現版本。
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
開發人員使用高級編程語言撰寫程序。接下來編譯器將代碼編譯成微軟的中間語言(CIL)。之后在執行過程中CLR會將CIL編譯為操作系統的原生碼(Native code)從而執行。CLR自帶有實時編譯器(JIT)。
CLR運行在windows上。查看通用語言架構可以找到該規格的實現版本列表。其中有一些版本是運行在非Windows的操作系統中。
什么是中間語言
通用中間語言(Common Intermediate Language,簡稱CIL,原名叫做MSIL)是一種屬于公共語言規范和.NET框架的低階(lowest-level)的人類可讀的編程語言,一種特殊的字節代碼。CIL類似一個面向對象的匯編語言,并且它是完全基于堆棧的。面向.NET框架的語言都會被各自的編譯器編譯為中間語言(CIL),運行時再經由特定的編譯器(JIT編譯器,Just In tIME,JITer)編譯為機器代碼,以供操作系統執行。
什么是托管代碼
所有.NET語言都可以編寫面向CLR的程序代碼,這種代碼在.NET中被稱為托管代碼(Managed
Code),所有的Managed Code都直接運行在CLR上
簡單點說就是:所有運行在CLR上的代碼就叫做托管代碼,具有與平臺無關的特性。
什么是程序集
程序集:顧名思義就是一個集合。
其中包括了:
l程序清單
描述了程序集的版本,語言文化,發布者,共有導出類型,以及組成該程序集的所有文件。
l元數據
提供有關程序集中定義的類型的信息,包括類型的名稱,可見性,基類和類型所實現的接口。注意:程序集清單和元數據說明了程序集是自我描述的。
lCIL:中間語言
程序集有兩種:
一種是可執行的應用程序文件(.exe擴展名文件)
一種是供其他應用程序使用的庫(.dll擴展名文件)
編譯器生成的中間語言(CIL)就被封裝在程序集中,該程序集中包含了描述你所創建的類,方法和屬性(例如安全需求)的所有元數據。你可以拷貝這個程序集到另一臺服務器上部署它。
C#與.NET的關系
C#是一個程序設計語言,僅僅是一個語言,是.NET框架中眾多開發語言中的一種。
C#程序的開發執行流程
1)編寫C#源程序(.cs)
2)通過編譯器編譯生成(.dll或.exe)
3)通過CLR運行,將CIL實時編譯編譯為機器碼,運行
HelloWorld案例的編寫和運行
(1)定義類
(2)寫main方法
(3)寫輸出語句
(4)C#程序開發運行與工作原理
(5)編譯和運行程序
---------------------------------------------------------------------------
classHelloWorld {
public static void Main(string[] args) {
Console.WriteLine("HelloWorld");
}
}
---------------------------------------------------------------------------
(1)程序解釋:
A:C#程序的最基本單位是類,所以我們要定義一個類。
格式:class類名
舉例:classHelloWorld
B:在類中寫內容的時候,用大括號括起來。
C:C#程序要想執行,必須有Main方法。
格式:publicstatic void Main(String[] args)
D:要指向那些東西呢,也用大括號括起來。
E:你要做什么呢?今天我們僅僅做了一個簡單的輸出
格式:Console.WriteLine("HelloWorld");
注意:""里面的內容是可以改動的。
常見的問題
lC#語言嚴格區分大小寫,請注意。
l見到非法字符:
\65307肯定是中文問題。我們寫程序要求標點符號必須全部是英文狀態。
l括號的配對問題。一般來說,括號都是成對出現的。
l遇到在類HelloWorld中找不到主方法,肯定是主方法的格式問題。
標識符
1)就是給類,接口,方法,變量等起名字時使用的字符序列
2)組成規則:
A.英文字母
B.數字
C.下劃線(_)
3)注意事項
A.不能包含空格和其他字符
B.不能以數字開頭
C.不能是C#中的關鍵字
D.區分大小寫
4)常見的命名規則
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:可以幫助我們調試程序。
后面我們會講解一個更高端的一個調試工具
常量
1)在程序執行的過程中,其值不發生改變的量
2)常量可以是任何基本數據類型
3)分類:
A:字面值常量
B:自定義常量(后面講)
4)字面值常量
A.字符串常量"hello"
B.整數常量12,23
C.小數常量12.345
D.字符常量'a','A','0'
E.布爾常量true,false
F.空常量null(后面講)
G.等等……
5)在C#中針對整數常量提供了四種表現形式
A.二進制由0,1組成。以0b開頭。
B.八進制由0,1,...7組成。以0開頭。
C.十進制由0,1,...9組成。整數默認是十進制。
D.十六進制由0,1,...9,a,b,c,d,e,f(大小寫均可)組成。以0x開頭。
進制轉換(了解)
1)其他進制到十進制s
系數:就是每一個位上的數值
基數:x進制的基數就是x
權:對每一個位上的數據,從右,并且從0開始編號,對應的編號就是該數據的權。
結果:系數*基數^權次冪之和。
2)十進制到其他進制
除基取余,直到商為0,余數反轉。
3)進制轉換的快速轉換法
A.十進制和二進制間的轉換
8421碼。
128、64、32、16、8、4、2、1
B.二進制到八進制,十六進制的轉換
原碼反碼補碼(了解)
1)為什么要學習原碼反碼補碼?
后面要學習強制類型轉換,如果不知道有原反補會看不懂結果
2)有符號數據表示法的幾種方式
A.原碼
就是二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
通過一個字節,也就是8個二進制位表示+7和-7
0(符號位)0000111
1(符號位)1000111
B.反碼
正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
C.補碼
正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
3)練習
A.已知原碼求補碼
0b10110100
B.已知補碼求原碼
0b11101110
變量
1)在程序的執行過程中,其值在某個范圍內可以發生改變的量
2)變量的定義格式:
A.數據類型變量名=初始化值;
B.數據類型變量名;
變量名=初始化值;
3)使用變量的注意事項:
A.作用域
變量定義在哪一級大括號中,哪個大括號的范圍就是這個變量的作用域。相同的作用域中不能定義兩個同名變量。
B.初始化值
局部變量在使用之前必須賦值
C.一條語句可以定義多個變量(不建議)
inta,b,c...;
數據類型
首先要了解一點:C#認可的基礎數據類型并沒有內置于C#語言中,而是內置于.net Framework中(CTS)。
如,在c#中聲明一個int類型的數據時,聲明的實際上是.net結構System.Int32的一個實例。這聽起來似乎很深奧,但其意義深遠:這表示在語法上,可以把所有的基礎數據類型看作是支持某些方法的類。
類型實際上仍存儲為基本類型。基本類型在概念上用.Net結構表示,所以肯定沒有性能損失。
1)C#是一種強類型語言,針對每種數據都提供了對應的數據類型,在內存中分配了不同大小的內存空間
2)分類:
A.基本數據類型:4類8種
B.引用數據類型:string,Dynamic,類,接口,數組,指針。
3)基本數據類型
A.整數CTS占用字節數
byteSystem.Byte1
shortSystem.Int162
intSystem.Int324
longSystem.Int648
B.浮點數
floatSystem.Single4
doubleSystem.Double8
C.字符
charSystem.Char2
D.布爾
boolSystem.Boolean1
注意:
整數默認是int類型,浮點數默認是double。
長整數要加L或者l。
單精度的浮點數要加F或者f。
4)char數據類型特點(掌握)
A.char c = (char)97;//結果為'a',char范圍0到65535
B.C#語言中的字符char可以存儲一個中文漢字嗎?為什么呢?
可以。因為在.NET里,類型System.Char代表一個Unicode字符。
Unicode編碼中的每個字符占用兩個字節。中文也是占的兩個字節。
所以,C#中的字符可以存儲一個中文漢字。
數據類型轉換
1)bool類型不參與轉換
2)默認轉換
A.從小到大
B.byte,short,char -- int -- long-- float -- double
C.byte,short,char之間不相互轉換,直接轉成int類型參與運算。其他類型進行混合運算的是小的數據類型提升為大的
3)強制轉換
A.從大到小
B.可能會有精度的損失,一般不建議這樣使用。
C.格式:
目標數據類型變量名= (目標數據類型) (被轉換的數據);
D.例子:
int a = 10;
byte b = 20;
b = (byte)(a + b);
4)思考題和面試題:
A.下面兩種方式有區別嗎?
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#有常量優化機制,就是在編譯的的時候直接把3和4的結果賦值給b4了
C.下面的操作結果是什么呢?
byte b = (byte)130;//byte的范圍-128-127,
JAVA里一個byte取值范圍是-128~127,所以結果會是-126
而C#里一個byte取值范圍是0~255,所以結果還是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)算術運算符
A.+,-,*,/,%,++,--
B.+的用法
a)加法
b)正號
c)字符串連接符
A./和%的區別
數據做除法操作的時候,/取得是商,%取得是余數
B.%運算符的特點
當左邊的絕對值小于右邊絕對值時,結果是左邊
當左邊的絕對值等于右邊或是右邊的倍數時,結果是0
當左邊的絕對值大于右邊絕對值時,結果是余數
%運算符結果的符號只和左邊有關系,與右邊無關
任何一個正整數%2結果不是0就是1可以用來當作切換條件
C.++和--的用法
a)他們的作用是自增或者自減
b)使用
**單獨使用
放在操作數據的前面和后面效果一樣。
a++或者++a效果一樣。
**參與操作使用
放在操作數的前面:先自增或者自減,再參與操作
inta = 10;
intb = ++a;
放在操作數的后面:先參與操作,再自增或者自減
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.擴展的賦值運算符的特點
隱含了自動強制轉換。
D.面試題:
short s = 1;
s= s + 1;//報錯,改為s = (s的數據類型)(s +1);
shorts = 1;
s+= 1;//等價于s = (s的數據類型)(s +1);
請問上面的代碼哪個有問題?
3)比較運算符
A.==,!=,>,>=,<,<=
B.無論運算符兩端簡單還是復雜最終結果是boolean類型。
C.千萬不要把==寫成了=
4)邏輯運算符
A.&,|,^,!,&&,||
B.邏輯運算符一般用于連接boolean類型的表達式或者值。
C.表達式:
就是用運算符把常量或者變量連接起來的符合java語法的式子。
算術表達式:a + b
比較表達式:a == b(條件表達式)
D.結論
&:有false則false
|:有true則true
^:相同則false,不同則true。//情侶關系。
!:非true則false,非false則true
&&:結果和&是一樣的,只不過有短路效果。左邊是false,右邊不執行。
||:結果和|是一樣的,只不過有短路效果。左邊是true,右邊不執行。
5)位運算符(了解)
&,|,^,~ ,>>,>>>,<<
A.位運算符的特點
都是針對補碼進行操作的
B.結論:
&(位與):有0則0
|(位或):有1則1
^(位異或):相同則0,不同則1
~:按位取反
<<:左移左邊最高位丟棄,右邊補齊0
>>:右移最高位是0,左邊補齊0;最高為是1,左邊補齊1
>>>:無符號右移無論最高位是0還是1,左邊補齊0
C.^的特殊用法
一個數據針對另一個數據位異或兩次,該數不變
D.面試題
a)請實現兩個變量的交換
**采用第三方變量
**用位異或運算符
左邊a,b,a
右邊a^b
b)請用最有效率的方式計算出2乘以8的結果
2<<3
6)三元運算符
A.格式
比較表達式?表達式1:表達式2;
B.執行流程:
首先計算比較表達式的值,看是true還是false。
如果是true,表達式1就是結果。
如果是false,表達式2就是結果。
C.案例:
a)比較兩個數據是否相等
b)獲取兩個數據中的最大值
c)獲取三個數據中的最大值
鍵盤錄入
1)實際開發中,數據是變化的,為了提高程序的靈活性,我們加入鍵盤錄入數據。
2)如何實現呢?目前就記住
引入命名空間
usingSystem;
位置:
可以是在namespace的上面或namespace里頭class上面
可以在class上面,沒有namespace的情況
獲取數據
Console.ReadLine();
3)把三元運算符的案例加入鍵盤錄入改進。
流程控制語句
1)順序結構
從上往下,依次執行
2)選擇結構
按照不同的選擇,執行不同的代碼
3)循環結構
做一些重復的代碼
if語句
1)三種格式
A.格式1
if(比較表達式) {
語句體;
}
執行流程:
判斷比較表達式的值,看是true還是false
如果是true,就執行語句體
如果是false,就不執行語句體
B.格式2
if(比較表達式) {
語句體1;
}else{
語句體2;
}
執行流程:
判斷比較表達式的值,看是true還是false
如果是true,就執行語句體1
如果是false,就執行語句體2
C.格式3
if(比較表達式1) {
語句體1;
}elseif(比較表達式2){
語句體2;
}
...
else{
語句體n+1;
}
執行流程:
判斷比較表達式1的值,看是true還是false
如果是true,就執行語句體1
如果是false,就繼續判斷比較表達式2的值,看是true還是false
如果是true,就執行語句體2
如果是false,就繼續判斷比較表達式3的值,看是true還是false
...
如果都不滿足,就執行語句體n+1
2)注意事項
A.比較表達式無論簡單還是復雜,結果是boolean類型
B.if語句控制的語句體如果是一條語句,是可以省略大括號的;如果是多條,不能省略。建議:永遠不要省略。
C.一般來說,有左大括號,就沒有分號,有分號,就沒有左大括號。
D.else后面如果沒有if,是不會出現比較表達式的。
E.三種if語句其實都是一個語句,只要有一個執行,其他的就不再執行。
3)案例:
A.比較兩個數是否相等
B.獲取兩個數中的最大值
C.獲取三個數中的最大值(if語句的嵌套)
D.根據成績輸出對應的等級
E.根據月份,輸出對應的季節
F.根據x計算對應y的值并輸出
4)三元運算符和if語句第二種格式的關系
所有的三元運算符能夠實現的,if語句的第二種格式都能實現。
反之不成立。
如果if語句第二種格式控制的語句體是輸出語句,就不可以。
因為三元運算符是一個運算符,必須要有一個結果返回,不能是一個輸出語句。
switch語句
1)格式:
switch(表達式) {
case值1:
語句體1;
break;
case值2:
語句體2;
break;
default:
語句體n+1;
break;
}
2)格式解釋說明:
switch:說明這是switch語句。
表達式:與JAVA不同,在C#中可以是整數(byte,short,int,long)、char、string、bool、enum
case:后面的值就是要和表達式進行比較的值
break:表示程序到這里中斷,跳出switch語句
default:如果所有的情況都不匹配,就執行這里,相當于if語句中的else
3)面試題
switch語句的表達式可以是byte嗎?可以是long嗎?可以是String嗎?
答:都可以。
4)執行流程:
A.首先計算表達式的值
B.和每一個case進行匹配,如果有就執行對應的語句體,看到break就結束。
C.如果沒有匹配,就執行default的語句體n+1。
5)注意事項:
A.case后面只能是常量,不能是變量,而且,多個case后面的值不能出現相同的
B.default可以省略嗎?
可以省略,但是不建議,因為它的作用是對不正確的情況給出提示。
特殊情況:
case就可以把值固定。
A,B,C,D
C.break可以省略嗎?
與java不同,在C#中不可以省略,C#中不允許出現case穿透。
但是可以多case:
switch (l)
{
case 4:
case 5:
Console.Write(4);
break;
}
D.default一定要在最后嗎?
不是,可以在任意位置。但是建議在最后。
E.switch語句的結束條件
(1)遇到break就結束了
注:與java不同,在C#中每個case或default中都必須有break
(2)執行到末尾就結束了
6)案例:
A.鍵盤錄入一個數字(1-7),輸出對應的星期幾。
B.單項選擇題
C.根據給定的月份,輸出對應的季節
7)if語句和switch語句各自的場景
A.if
針對boolean類型的判斷
針對一個范圍的判斷
針對幾個常量的判斷
B.switch
針對幾個常量的判斷
循環語句
1)有三種:for,while,do...while
2)for循環語句
A.格式
for(初始化語句;判斷條件語句;控制條件語句){
循環體語句;
}
執行流程:
(1)執行初始化語句
(2)執行判斷條件語句
如果這里是true,就繼續
如果這里是false,循環就結束
(3)執行循環體語句
(4)執行控制條件語句
(5)回到b
B.注意事項
(1)判斷條件語句無論簡單還是復雜,結果是boolean類型
(2)循環體語句如果是一條,可以省略大括號,但是不建議
(3)有分號就沒有左大括號,有左大括號就沒有分號
C.案例
(1)輸出10次HelloWorld
(2)輸出1-10的數據
(3)輸出10-1的數據
(4)求1-10的和
(5)求1-100的和,求1-100的偶數和,求1-100的奇數和
(6)求5的階乘
(7)在控制臺打印水仙花數
(8)統計水仙花個數
(9)改進版的回文數
一個五位數
個位=萬位
十位=千位
個位+十位+千位+萬位=百位
(10)統計1-1000之間同時滿足如下條件的數據有多少個
x%3==2
x%5==3
x%7==2
3)while循環
A.格式:
基本格式
while(判斷條件語句) {
循環體語句;
}
擴展格式:
初始化語句;
while(判斷條件語句){
循環體語句;
控制條件語句;
}
通過查看這個格式,我們就知道while循環可以和for循環等價轉換。
B.執行流程:
(1)執行初始化語句
(2)執行判斷條件語句,看其返回值是true還是false
如果是true,就繼續執行
如果是false,就結束循環
(3)執行循環體語句;
(4)執行控制條件語句
(5)回到B繼續。
C.while的練習
把for語句的練習用while改進
D.for和while的區別
(1)使用上的區別
for語句的那個控制條件變量,在循環結束后不能在使用了。
而while的可以繼續使用。
(2)理解上的區別
for適合于一個范圍的判斷
while適合次數不明確的
舉例:吃葡萄
E.案例:
(1)珠穆朗瑪峰問題
(2)小芳存錢問題(break以后才能做)
4)do...while循環
A.格式
基本格式
do{
循環體語句;
}while(判斷條件語句);
擴展格式:
初始化語句;
do{
循環體語句;
控制條件語句;
}while(判斷條件語句);
通過查看格式,我們就可以看出其實三種循環的格式可以是統一的。
B.執行流程:
(1)執行初始化語句
(2)執行循環體語句;
(3)執行控制條件語句
(4)執行判斷條件語句,看其返回值是true還是false
如果是true,就繼續執行
如果是false,就結束循環
(5)回到b繼續。
5)三種循環語句的區別:
do...while循環至少執行一次循環體。
而for,while循環必須先判斷條件是否成立,然后決定是否執行循環體語句。
6)循環使用的注意事項(死循環)
A.一定要注意修改控制條件,否則容易出現死循環。
B.最簡單的死循環格式
(1)while(true){...}
(2)for(;;){}
7)練習:
A.請輸出一個4行5列的星星(*)圖案。如圖:
*****
*****
*****
*****
B.請輸出正三角形,如圖:
*
**
***
****
*****
C.在控制臺輸出九九乘法表。
控制跳轉語句
1)break:中斷的意思
A.用在循環和switch語句中,離開此應用場景無意義。
B.作用
(1)跳出單層循環
(2)跳出多層循環,需要標簽語句的配合
2)continue:繼續
A.用在循環中,離開此應用場景無意義。
B.作用
跳出單層循環的一次,可以繼續下一次
C.填空題
for(intx=1; x<=10; x++) {
if(x%3== 0) {
//補齊代碼
}
Console.WriteLine("C#基礎班");
}
如何讓控制臺輸出2次:C#基礎班
如何讓控制臺輸出7次:C#基礎班
如何讓控制臺輸出13次:C#基礎班
3)標號+ goto:
A.作用
標記某個循環對其控制
B.組成規則
其實就是合法的標識符
C.例子:(跳出多層循環)
------------------------------------------------------------------------
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:返回
用于結束方法的,后面還會在繼續講解和使用。
一旦遇到return,程序就不會在繼續往后執行。
5)return和break以及continue的區別?
return是結束方法
break是跳出循環
continue是終止本次循環繼續下次循環
6)練習題:
for(intx=1; x<=10; x++) {
if(x%3==0) {
//在此處填寫代碼
}
Console.WriteLine(“C#基礎班”);
}
我想在控制臺輸出2次:“C#基礎班“
我想在控制臺輸出7次:“C#基礎班“
我想在控制臺輸出13次:“C#基礎班“
方法
1)方法:就是完成特定功能的代碼塊,提高代碼的復用性。
注意:在很多語言里面有函數的定義,而在Java中,函數被稱為方法。
2)格式:
修飾符返回值類型方法名(參數類型參數名1,參數類型參數名2...) {
方法體語句;
return返回值;
}
3)格式說明:
修飾符:目前就用public static。后面再詳細講解其他修飾符
返回值類型:就是功能結果的數據類型
方法名:符合命名規則即可,方便我們調用該方法。
參數類型:就是參數的數據類型
參數名:就是變量
參數分類:
實參:實際參與運算的數據
形參:方法上定義的,用于接收實際參數的變量
方法體語句:就是完成功能的代碼塊
return:結束方法
返回值:就是功能的結果,由return帶給調用者。
4)兩個明確:
返回值類型:結果的數據類型
參數列表:參數的個數及對應的數據類型
5)方法調用
A.有明確返回值的方法
(1)單獨調用,沒有意義
(2)輸出調用,不是很好,因為我可能需要不結果進行進一步的操作。但是講課一般我就用了。
(3)賦值調用,推薦方案
B.void類型修飾的方法
單獨調用
6)方法的注意事項
A.方法不調用不執行
B.方法之間是平級關系,不能嵌套定義
C.方法定義的時候,參數是用,隔開的
D.方法在調用的時候,不用在傳遞數據類型
E.如果方法有明確的返回值類型,就必須有return語句返回。
7)案例:
A.求和方案
B.獲取兩個數中的較大值
C.比較兩個數據是否相同
D.獲取三個數中的最大值
E.輸出m行n列的星形
F.輸出nn乘法表
8)方法重載
A.在同一個類中,方法名相同,參數列表不同。與返回值無關。
B.參數列表不同:
(1)參數的個數不同。
(2)參數的對應的數據類型不同。
(3)參數的順序不同(算重載,但是在開發中不用)
9)方法重載案例
不同的類型的多個同名方法的比較。
數組
1)數組:存儲同一種數據類型的多個元素的容器,既可以存儲基本數據類型,也可以存儲引用數據類型。
2)特點:每一個元素都有編號,從0開始,最大編號是長度-1。
編號的專業叫法:索引
3)定義格式
數據類型[]數組名;
4)數組的初始化
就是為數組開辟連續的內存空間,并為每個數組元素賦予值
A.動態初始化
只給長度,系統給出默認值
舉例:int[] arr= new int[3];
B.靜態初始化
給出值,系統決定長度
舉例:int[] arr= new int[]{1,2,3};
簡化版:int[] arr= {1,2,3};
5)數組操作的兩個常見小問題:
A.數組索引越界異常
原因:你訪問了不存在的索引。
B.空指針異常
原因:數組已經不在指向堆內存了。而你還用數組名去訪問元素。
例子:
int[]arr = {1,2,3};
arr= null;
Console.WriteLine(arr[0]);
6)C#的內存分配
A.棧存儲局部變量
B.堆存儲所有new出來的
C.方法區(面向對象部分詳細講解)
D.本地方法區(系統相關)
E.寄存器(CPU使用)
注意:
a:局部變量在方法定義中或者方法聲明上定義的變量。
b:棧內存和堆內存的區別
棧:數據使用完畢,就消失。
堆:每一個new出來的東西都有地址
每一個變量都有默認值
byte,short,int,long0
float,double 0.0
char'\u0000'
booleanfalse
引用類型null
數據使用完畢后,在垃圾回收器空閑的時候回收。
(7)數組內存圖
A:一個數組
B:二個數組
C:三個數組(兩個棧變量指向同一個堆內存)
(8)數組的常見操作
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;
}
---------------------------------------------------------------------------