[MVC教學] 01. What is C#?

 · 5 mins read

C# 是什麼

  • Microsoft 微軟公司所開發出來的語言,通常 C# 比較適合在 Windows 底下運行,Linux、MacOS 則需透過 Mono 來運作。
  • C# 既簡單、強大、型別安全且為物件導向,同時保留 C 樣式語言的易讀性與簡潔性。 熟悉 C 和類似語言的任何人在適應 C# 方面很少有問題。



C# 運作原理

  • C# 執行須依賴 .NET Framework 上來運作。
  • C# 原始程式碼+資源+參考→ C# 編譯器→建立執行檔(.exe 或 .dll)→.Net Framework→作業系統



C# 開發環境(IDE)

  • Visual Studio 2015 Express for Web download



檔案架構

  • VS > 檔案 > 新增 > 專案 > Visual C# > 傳統桌面 > 主控台應用程式

  • 新增完架構如下:   ConsoleAPP

  ├── ConsoleApp.sln :方案,版控。

  └── ConsoleAPP

   └── ConsoleAPP.csproj :專案。

   └── bin

     └── Debug

      └── ConsoleAPP.exe :執行檔。

      └── ConsoleAPP.pdb :程式經由 CLR 編譯過轉變成 mange code。 (.NET章節細講)



物件的結構

  • 由小到大:Function < Class(object) < NameSpace(Object) < Library ,這個結構範圍不會有反向結構存在。



存取範圍的關鍵字

  • public:最寬鬆的限制,所有人都可以存取。
  • private:最嚴謹的限制,只有在 class 內部才能存取。
  • protected:介於 public 和 private 之間,保護型別,不管是否在相同的命名空間中,該成員能在自身類別和被繼承的子類別內進行存取(一定要是子類別)。
  • internal:只有同一命名空間的類別可以進行存取。
  • protected internal:不管是否在相同的命名空間中,該成員能在自身類別和被繼承的子類別內進行存取和相同命名空間的類別(不一定是子類別)。
  • Sealed:禁止繼承、覆寫,也可以用在 class 裡面,當 class 被繼承時就能限制哪些子項目不能被覆寫。

    sealed class SealedClass 
    { 
       public int x; 
       public int y; 
    }
    



overload 和 override

Function 層級的操作應用。

overload 重載

  • 相同的 function 名稱 上根據不同的需求以及參數數量所延伸出來。

    public class Class1 
      { 
        public void Test() 
        { 
          //...do something... 
        } 
        public void Test(string para1) 
        { 
          //...do something... 
        } 
        public void Test(string para1,string para2) 
        { 
          //...do something... 
        } 
        public void Test(string para1,string para2,int para3) 
        { 
          //...do something... 
        } 
      } 
    

override 覆寫

  • 繼承某個 class 類別後,覺得父類別裡面的 function 或者成員的實作方法不滿意,或不符合需求,那在繼承後透過 override 的方法在這一代建立全新的實作方法。

    public class Class1 
    { 
      public virtual void Test() 
      { 
      //...do something.. 
      } 
    } 
    //那繼承和覆寫就會這樣 
    public class Class2 : Class1 
    { 
      public override void Test() 
      { 
      //...do something.. 
      } 
    } 
    



Static 靜態類別

  • Static 的特點是一但宣告後,不管被做幾次 new 初始化或者被呼叫幾次都會使用相同的記憶體的位置 ,並不會因為 new 的初始化又挖一塊記憶體放這個值。
  • static 的值被某一個功能引用到並修改其內容後,可能會造成其他的邏輯使用上發生非預期的值。

    static void Main(string[] args) 
    { 
      //這裡會做三次實體化 
      Member x = new Member(); 
      x.Add();// 結果 1 
      Member y = new Member(); 
      y.Add();// 結果 2 
      Member z = new Member(); 
      z.Add();// 結果 3 
      x.Add();// 結果 4 
      y.Add();// 結果 5 
      z.Add();// 結果 6 
    } 
    class Member 
    { 
      //將 count 設定為靜態類別 
      public static int count = 0;   //static 
      public void Add() 
      { 
        count++; 
        Console.WriteLine("不管你怎麼new,呼叫的都是同一個count: "+count); 
      } 
    }
    



抽象類別 Abstract Class 和 介面 Interface

抽像類別和介面這兩個東西就像是一個 模版 ,為了方便管理這些發展出用於不同情境應用的程式碼。 像樂高積木一樣,你可以用每個物件做出自己想要的東西。

介面 Interface

是個像是 零件 的東西,像要組合一台販賣機要有很多零件,以販賣機的模組來看 "投錢+按鈕選擇+吐出貨品",就可以定義 3 個 interface ,因為單從功能來看這 3 個功能彼此沒關係,但是"投錢"這個功能,裡面還會包含細部的處理流程,(像是判斷真偽、判斷金額、硬幣的重量)

  • 宣告的 Interface 不能直接被使用(實例化)
  • 介面內定義的 function 不需要進行實作。
  • 繼承者在繼承後都要自行實作抽象方法。(就是未被實作的function)
  • Interface 可以被類別同時實作多個介面,就是所謂的物件組合。

    interface 投錢  //投幣零件
    { 
      void 稱重;     //功能
      void 判斷金額; 
      void 判斷真偽; 
    } 
      
    interface 按鈕 
    { 
      void 定義按鈕數量; 
      void 判斷被選擇像目; 
      void 判斷是否有貨; 
      void 記錄賣出次數; 
    } 
    

抽像類別 Abstract Class

像是 半成品 ,如飲料販賣機的模版,拿去使用你只能生產賣飲料的販賣機,不能拿去賣食物。

  • 宣告的 Interface 不能直接被使用(實例化)。
  • 介面內定義的 function 不需要進行實作。
  • 繼承者在繼承後都要自行實作抽象方法(就是未被實作的 function)。
  • 只能被單一繼承,抽像類別屬於繼承架構,也因為它是半成品所以相依性很強。

    abstract class 飲料販賣機A 
    { 
       public void 台灣限定功能(int x, int y) 
       { 
          //...do 限定版條件功能... 
       } 
       protected abstract void 流程功能1(); 
       protected abstract void 流程功能2(); 
       protected abstract void 流程功能3(); 
     } 
             
     abstract class 飲料販賣機B :飲料販賣機A,投錢,按鈕 
     { 
       //實作投錢 
       void 稱重; 
       void 判斷金額; 
       void 判斷真偽; 
       //實作按鈕 
       void 定義按鈕數量; 
       void 判斷被選擇像目; 
       void 判斷是否有貨; 
       void 記錄賣出次數; 
       //飲料販賣機A 
       private override void 流程功能1(); 
       private override void 流程功能2(); 
       private override void 流程功能3(); 
       //飲料販賣機B 
       private void 販賣機B功能1(); 
       private void 販賣機B功能2(); 
     } 
    



泛型型別 1

  • 泛型可讓開發人員定義 型別安全 資料結構,而不需要認可至實際資料類型。
  • 例如,List<T> 是可宣告的 泛型集合 ,並可搭配任何類型使用:List<int>List<string>List<Person> 等等。
  • 泛型清單的排序速度比非泛型清單的排序速度明顯更快。
  • 非泛型 List<int> 只能 放置 int 型別的資料。

    List<int> ListGeneric = new List<int> { 5, 9, 1, 4 }; //非泛型
    ArrayList ListNonGeneric = new ArrayList { 5, 9, 1, 4 }; //泛型
    



Lambda 運算式 1

  • Lambda 運算式 x => x * x 會指定名為 x 的參數,並傳回 x 的平方值。

    delegate int del(int i);  
    static void Main(string[] args)  
    {  
        del myDelegate = x => x * x;  
        int j = myDelegate(5); //j = 25  
    }