注1.:當你點擊調試或者生成解決方案的時候這就是一個編譯過程首先CLR加載源文件也就是你寫的代碼(此代碼在文件中是字符串)然后將項目中的嗲嗎編譯成IL代碼進而生成程序集 證明過程 用反編譯工具反編譯.exe文件 。更深層次的變化我也不知道。
注2.當項目啟動時,CLR(公共語言運行庫)會加載項目里的所有類到內存,并找到其中的主函數,作為默認的啟動函數調用執行。但是如果項目中包含一個以上的主函數時,clr因為不知道要從哪個啟動,所以報錯。反之如果項目中沒有包含主函數,clr也不知道如何啟動,所以也報錯。
?聲明一個變量的時候,其實是在內存的棧里面開辟空間,默認情況下的值是null;如 int[] arrInt;//此時arrint等于null;int[] arrInt= new int[5];注意等號左側在棧中間開辟了一個小空間;右邊在堆空間里,開辟了連續的5個空間;等號執行的時候,會將堆里開辟的第一個空間的地址賦值給棧里的空間。
**數組的聲明與創建如下圖:
1.為什么要有方法? 1.重復調用 2.封裝具體的實現。
2.概念:
函數就是將一堆代碼進行重用的一種機制。函數就是一段代碼,這段代碼可能有輸入的值(參數),可能會返回值。一個函數就像一個專門做這件事的人,我們調用它來做一些事情,它可能需要我們提供一些數據給它,它執行完成后可能會有一些執行結果給我們。要求的數據就叫參數,返回的執行結果就是返回值。
3.string s=Console.ReadLine()就是一個有返回結果的函數;
Console.WriteLine(“hello”)就是一個有執行參數的函數,只有告訴WriteLine被打印的數據它才知道如何打??;
int i=Convert.ToInt32("22")則是一個既有參數又有返回值的函數。
注:有了函數寫代碼就像拼積木,C#中的各種各樣的技術其實就是通過for、if等這些基礎的語法將不同的函數按照一定的邏輯組織起來。
4.方法的定義:
[訪問修飾符] [static] 返回值類型 方法名(參數列表)
{
方法體;
}
方法的大括號就是一個作用域塊,在該作用域里聲明的變量只能在該作用域使用。 命名規則:方法名開頭大寫,參數名開頭小寫,參數名、變量名要有意義
方法的調用,對于靜態方法,如果在同一個類中,直接寫名字調用就行了. return 為方法返回值。 同時可以立即退出方法。
5.常用的已經學過的方法:
Console.WriteLine();
Console.Write();
Console.ReadLine();
Console.ReadKey();
int.Parse(string);
Convert.ToInt32(string);
對于由static修飾的方法,使用:類名.方法名()調用.
如果在類中調用自己的由static修飾的方法,可以省略類名.
static void(){ for(int i = 0; i < 10 ;i++) { for(int j = 0 ;j<10;j++) { break;//退出當前循環 continue; //退出本次循環 Console.WriteLine(“不執行了”); } }}
注1.break 退出當前循環的意思是不管 J 等于3或者4 里面的for循環都不執行了。
注2.continue 推出本次循環的意思是 continue下面的console.writeline本次不執行了 接著執行 J 等于 1的下一次循環。
1.閱讀下面的程序,說一下輸出結果是多少?
2.
局部變量:在方法中定義的變量,其作用域從定義開始,到其所在的大括號結束為止。問題:在if中的呢?在一個方法中想要訪問另一個方法中的變量,怎么辦?兩種解決方法:參數和返回值 舉例:寫一個方法,判斷一個年份是否是潤年.
方法中的return語句
導致函數立即返回。
有void 表示無返回值,當然就不用return。
在返回值非void的函數中return值
//只要出現了大括號,就會有一個新的作用域塊,那么該作用域中創建的對象都不能超出此作用域訪問。
其實大家看僅僅這一個console.writeline微軟就封裝很多,有時候我只知道怎么用,為什么它能這么用,微軟為了使用方便封裝了太多的東西讓你看不到。
問題 : 為什么要有方法的重載? 可以只記一個方法名,傳入不同的參數,就可以調用對應的方法。
示例:使用方法重載來完成計算器
public class _20120213_02簡單計算器 { //方法重載的關鍵條件,是方法名一致,參數列表不同; //使用方法重載,來完成簡單的計算器 static void Main4(string[] arr) { //要求,接收用戶的兩個數,當然,可以是整型的,也可以是小數的 //輸出:兩數的結果 //提示用戶輸入第一個數 Console.WriteLine("請輸入第一個數:"); //接受第一個數 string strNumA = Console.ReadLine(); //提示用戶輸入第二個數 Console.WriteLine("請輸入第二個數:"); //接受第二個數 string strNumB = Console.ReadLine(); //計算結果 if (strNumA.IndexOf('.') > -1 || strNumB.IndexOf('.') > -1) { double fNumA = Convert.ToDouble(strNumA); double fNumB = Convert.ToDouble(strNumB); double iResult = Add(fNumA, fNumB); Console.WriteLine("結果:" + iResult); } else { int iNumA = Convert.ToInt32(strNumA); int iNumB = Convert.ToInt32(strNumB); int iResult= Add(iNumA, iNumB); Console.WriteLine("結果:"+iResult); } Console.ReadKey(); } //以下的三個方法,名字一樣,但是方法的參數列表 個數 或 類型 不同,所以構成了方法重載 static int Add(int numA, int numB) { return numA + numB; } static double Add(double numA, double numB) { return numA + numB; } static double Add(double numA) { return numA; } }
注 :out與ref的相同點和不同點。
相同點 : 凡事使用out/ref修飾的參數,傳遞的都是引用。
不同點: 1.out關鍵字側重于輸出參數,也就是我調用你這個方法,是為了通過輸出的方式獲得值。(return返回值也是為了通過方法獲得值):通常在方法需要多個值的時候使用。所以out參數必須在方法返回多個值的時候使用
2..ref側重于修改:也就是我調用你這個方法,病傳入參數的目的是為了在方法中修改傳入的這個變量。所以ref參數必須在傳入之前就賦值。
代碼示例:
public class _20120213_05ATM { static void Main(string[] str) { double myMoney = 30000; Operating(ref myMoney); } #region 01.ATM啟動 /// <summary> /// 01.ATM啟動 /// </summary> /// <param name="count">賬戶余額</param> static void Operating(ref double count) { do { Console.WriteLine("請問您是要存還是取呢?親~~(1-存,2-取)~"); string optType = Console.ReadLine(); if (optType != "1" && optType != "2") { Console.WriteLine("您輸入的操作類型有誤,請重新輸入~~"); continue; } do { Console.WriteLine("請輸入要操作的金額(以元為單位):"); string strMoney = Console.ReadLine(); double dMoney = 0; if (double.TryParse(strMoney, out dMoney))//如果轉換成功返回true;并且dMoney里已被賦值。 { //傳入參數:操作類型,操作金額,賬戶余額 if (Branch(optType, dMoney, ref count)) { Console.WriteLine("操作完畢,成功啦~~"); Console.WriteLine("顯示余額:" + count); break;//如果操作過程么有錯誤,則跳出 當前循環(此循環用來在數據類型有誤時提示用戶重新操作) } } else { Console.WriteLine("您輸入的數據類型有誤~~"); } } while (true); Console.WriteLine("是否要繼續操作?(Y/N)"); string strRes = Console.ReadLine(); if (strRes.ToUpper() == "N") { break;//跳出 整個操作循環,任務即將結束 } } while (true); Console.WriteLine("任務結束~~按任意鍵退出"); Console.ReadLine(); } #endregion #region 02.根據類型判斷操作 /// <summary> /// 02.根據類型判斷操作 /// </summary> /// <param name="optType"></param> static bool Branch(string optType,double money,ref double count) { switch (optType) { case "1": SaveMoney(money, ref count); return true; case "2": { return GetMoney(money, ref count); } default: return false; } } #endregion #region 03.存錢取錢 static void SaveMoney(double money, ref double count) { count += money; Console.WriteLine("存錢成功~~"); } static bool GetMoney(double money, ref double count) { if (money < count) { count -= money; Console.WriteLine("取錢成功~~"); } else { Console.WriteLine("Sorry,您的余額好像不足了哦~~~"); } return money < count; } #endregion }
示例代碼:
public class _20120213_06可變數組參數 { static void Main8(string[] str) { //一、可變參數params:使用的時候(調用方法的時候): //1.還是可以直接傳數組進去的 string[] dogsNames = { "小花", "小妞", "阿黃", "大黃", "小強" }; //BuyDogs(dogsNames); //2.也可以直接傳 和 參數數組 同類型的 元素進去 //BuyDogs("小花", "小妞", "阿黃", "大黃", "小強"); //二、容易犯的錯 //規定 可變參數 在一個方法的參數列表中: //1.方法的參數列表中 可變參數 只能有一個; //2.這僅有的一個 可變參數 必須在參數列表的最后; BuyDogs("劉德華", "小花", "小妞", "阿黃", "大黃", "小強"); Console.ReadLine(); } static void BuyDogs(params string[] dogsNameArr) { for (int i = 0; i < dogsNameArr.Length; i++) { Console.WriteLine("第" + (i + 1) + "只小狗的名字為:" + dogsNameArr[i]); } } static void BuyDogs(string masterName,params string[] dogsNameArr) { for (int i = 0; i < dogsNameArr.Length; i++) { Console.WriteLine(masterName + " 的第" + (i + 1) + "只小狗的名字為:" + dogsNameArr[i]); } } static void BuyDogs(string masterName, string masterName2, params string[] dogsNameArr) { for (int i = 0; i < dogsNameArr.Length; i++) { Console.WriteLine(masterName + ",masterName2=" + masterName2 + " 的第" + (i + 1) + "只小狗的名字為:" + dogsNameArr[i]); } } }
注: 當多個方法的參數列表中和后面可變參數的類型一樣的時候,用戶調用該方法,會優先調用參數多的方法。
--此文算是以后研究更深層次的引子吧,比如out和ref深層次的研究。
新聞熱點
疑難解答