數往知來C#之面向對象準備〈一〉

1.CLR加載編譯源文件

 

  捕獲01

注1.:當你點擊調試或者生成解決方案的時候這就是一個編譯過程首先CLR加載源文件也就是你寫的代碼(此代碼在文件中是字符串)而後將項目中的嗲嗎編譯成IL代碼進而生成程序集 證實過程 用反編譯工具反編譯.exe文件 。更深層次的變化我也不知道。數組

注2.當項目啓動時,CLR(公共語言運行庫)會加載項目裏的全部類到內存,並找到其中的主函數,做爲默認的啓動函數調用執行。可是若是項目中包含一個以上的主函數時,clr由於不知道要從哪一個啓動,因此報錯。反之若是項目中沒有包含主函數,clr也不知道如何啓動,因此也報錯。函數

2.多維數組和交錯數組

❶聲明一個變量的時候,實際上是在內存的棧裏面開闢空間,默認狀況下的值是null;如 int[] arrInt;//此時arrint等於null;int[] arrInt= new int[5];注意等號左側在棧中間開闢了一個小空間;右邊在堆空間裏,開闢了連續的5個空間;等號執行的時候,會將堆裏開闢的第一個空間的地址賦值給棧裏的空間。工具

**數組的聲明與建立以下圖:spa

捕獲02

捕獲03

多維數組和交錯數組

3.方法 參數 返回值

1.爲何要有方法?           1.重複調用      2.封裝具體的實現。3d

2.概念:調試

函數就是將一堆代碼進行重用的一種機制。函數就是一段代碼,這段代碼可能有輸入的值(參數),可能會返回值。一個函數就像一個專門作這件事的人,咱們調用它來作一些事情,它可能須要咱們提供一些數據給它,它執行完成後可能會有一些執行結果給咱們。要求的數據就叫參數,返回的執行結果就是返回值。 code

3.string s=Console.ReadLine()就是一個有返回結果的函數;對象

Console.WriteLine(「hello」)就是一個有執行參數的函數,只有告訴WriteLine被打印的數據它才知道如何打印;blog

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修飾的方法,能夠省略類名.

4.退出多重循環

 

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的下一次循環。

5.變量的做用域(局部變量)

1.閱讀下面的程序,說一下輸出結果是多少?

圖片1

2.

局部變量:在方法中定義的變量,其做用域從定義開始,到其所在的大括號結束爲止。問題:在if中的呢?在一個方法中想要訪問另外一個方法中的變量,怎麼辦?兩種解決方法:參數和返回值       舉例:寫一個方法,判斷一個年份是不是潤年.
   方法中的return語句
   致使函數當即返回。
   有void 表示無返回值,固然就不用return。
   在返回值非void的函數中return值

//只要出現了大括號,就會有一個新的做用域塊,那麼該做用域中建立的對象都不能超出此做用域訪問。

6.關於Caonsole.WriteLine()分析 主要解釋方法的重載

 

捕獲04

其實你們看僅僅這一個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
    }

 

7.可變參數Params

示例代碼:

public class _20120213_06可變數組參數
    {
        static void Main8(string[] str)
        {
            //1、可變參數params:使用的時候(調用方法的時候):
            //1.仍是能夠直接傳數組進去的
            string[] dogsNames = { "小花", "小妞", "阿黃", "大黃", "小強" };
            //BuyDogs(dogsNames);
            //2.也能夠直接傳 和 參數數組 同類型的 元素進去
            //BuyDogs("小花", "小妞", "阿黃", "大黃", "小強");
            
            //2、容易犯的錯
            //規定 可變參數 在一個方法的參數列表中:
            //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深層次的研究。

相關文章
相關標籤/搜索