1. 程式人生 > >C#學習筆記 三

C#學習筆記 三

正文共: 2947字
預計閱讀時間: 8分鐘

寫在前面的話 : 程式語言的出現是為了讓機器更好的服務人類, 所以越是高階的程式語言人類使用起來就越方便, 隨著計算機硬體的發展高階程式設計終將會被大多數程式設計人員接受並使用。 但是學習C、彙編等與底層語言會使得程式設計人員更好的理解程式設計的原理,這也是一個程式設計人員的內功心法。

思維導圖

在這裡插入圖片描述

面向物件

( 面向物件就是一切以物件為基礎。 面嚮物件語言都是高階語言,而高階語言未必都是面向物件的。 因為相比面向過程面向物件更符合人類的思維方式。 )
舉例理解

注 : 此處參照了一些知乎上的回答,面向物件和麵向過程算是計算機的曠世難題

在以前, 我們洗衣服需要 以下流程 :A、盆中倒入洗衣粉 ——> B、 注入清水 ——> C、放入髒衣物 ——> D、 塗上肥皂,用手搓洗 ——> E、 更換清水,洗去清潔殘留物 ——> F、 用手擰乾水分。 如此大致 6步 然後家庭都要有人掌握一門洗衣服的技能, 這時一個很有想法的人就按照一個標準的洗衣服的流程提出了 “ 洗衣機 ”的設計( 這實際上就是我們 C# 中所通常所定義的類 )。於是有需要的家庭, 例如 :小明家, 就買了一臺 “洗衣機”回家用 ( 這就是物件的例項化,物件是具體的, 而類是抽象的 )。 只要 new 洗衣機() 並呼叫洗衣機中洗衣的方法 傳入引數 ( 髒衣服 ,洗衣液 ) 就完成了洗衣服的流程。 而一個 “ 洗衣機 ”類的創造 可以生產出無數的例項 從而解放了無數的家庭婦女。 讓她們可以從事更多自己想做的事。

這個例項充分說明了 “ 面向物件 ” 優點:

   > 提高了程式碼的重用性、靈活性、擴充套件性

   > 使得程式碼變得易於維護

個人理解 : 類算是方法、欄位、屬性等集合, 所以說面向物件程式設計中一切皆可為物件, 就是把一切功能重複的程式碼抽象化寫入類中重複呼叫 ( 即 程式碼重用 )。 靈活性的體現在於我們可以根據需求寫功能,在原有基礎上進行擴充套件卻不影響其他例項 ( 即 擴充套件性 )。 我們的例項物件只要呼叫類中自己所需要的那一部分功能即可。 例如 “ 洗衣機 ” 有快洗、標準、水溫度、還有針對不同型別衣物選擇洗滌模式。 在面向物件中我們可以打包在一個 “ 洗衣機 ”類裡。

專業術語
( 如果以後去面試一點專業術語回答不上就很尷尬了 )

    OOP ( Object Oriented Programming 面向物件的程式設計 ) , 這是一種計算機程式設計架構。

    OOA ( Object-Oriented Analysis 面向物件分析 ), 一種按照面向物件思想來分析問題的方法。

    OOAD  ( Object Oriented Analysis Design 面向物件分析與設計 ) ,現代軟體企業廣為採用的一項有效技術。

缺點
效能上對比 “ 面向過程 ” 有所損耗。

核心思想

封裝 :封裝是一種資訊隱蔽技術, 它體現於類的說明, 是物件的重要特性。 封裝的目的 在於把物件的設計者和物件者的使用分開, 使用者不必知曉行為實現的細節, 只須用設計者提供的訊息來訪問該物件。

繼承 :繼承意味著一個類隱式地將它的直接基類型別的所有成員當作自已的成員, 但基類的例項建構函式、解構函式和靜態建構函式除外。 繼承具有可傳遞性。

簡單程式碼示例
class Person
   {
       public void Print()
       { Console.WriteLine("被繼承的方法"); }
   }
   class Student : Person
   { }

static void Main(string[] args)
       { 
     Student stu = new Student();
           stu.Print();
           Console.ReadKey();
       }
   }
}

多型 :面向物件的多型性表現在 物件根據所接收的訊息而做出動作。 同一訊息為不同的物件接受時可產生完全不同的行動。

        主要體現於方法的過載 ( 允許同一類中的多個方法具有相同名稱,條件是這些方法具有唯一的簽名 )
class Person
   {
       public void Print()
       { Console.WriteLine("被繼承的方法"); }
public void Print(int n)
       { Console.WriteLine("被過載的方法"); }
   }
   class Student : Person
   { }

static void Main(string[] args)
       { 
     Student stu = new Student();
           stu.Print();
     stu.Print(1);
           Console.ReadKey();
       }
   }
}

引申 面向過程

概念 : 自頂向下、逐步求精、模組化封裝函式主張按功能把軟體系統逐步細分,對每個涉及到的功能都進行一次資料處理然後輸出。由主函式負責把函式中的所有介面串接起來,程式的實現非常強調達到某功能的演算法。每個函式都有唯一的入口和出口。

引數

C# 中定義了 四種 型別的引數

值引數 ( value parameter ) 用於傳遞輸入引數。 一個值引數相當於一個區域性變數, 只是它的初始值來自為該形參傳遞的實參。 對值引數的修改不影響為該形參傳遞的實參。

引用引數 ( reference parameter ) 用於傳遞輸入和輸出引數。 為引用引數傳遞的實參必須是變數, 並且在方法執行期間, 引用引數與實參變量表示同一儲存位置。 引用引數使用 ref 修飾符宣告。

輸出引數 ( output parameter ) 用於傳遞輸出引數。 對於輸出引數來說, 呼叫方提供的實參的初始值並不重要。 除此之外, 輸出引數與引用引數類似。 輸出引數是用 out 修飾符宣告的。

引數陣列 ( parameter array ) 允許向方法傳遞可變數量的實參。 引數陣列使用 params 修飾符宣告。 只有方法的最後一個引數才可以是引數陣列, 並且引數陣列的型別必須是一維陣列型別。

        程式碼示例
class Program
   {
       public const int N= 0; 
       static int Parameter(int n)//定義一個方法讓值型別引數+1
       {
           return n++;
       }
       static int RefParameter(ref int n)//定義一個方法讓引用引數+1
       {
           return n++;
       }
       static void OutParameter(int n1,out int out1)
       {
           out1 = n1 + 1 ;//輸出引數要先初始化賦值才能使用
       }
       static int ArrPatameter(params int[] arr)
       {
           int sum = 0;
           foreach (int i in arr)
           {
               sum = i + sum;
              // Console.WriteLine(i);
           }
           return sum;
       }
       static void Main(string[] args)
       {
           #region 

           int num = 1;

           Parameter(num);
           Console.WriteLine("輸出值型別引數的最終值 : {0}", num);

           RefParameter(ref num);
           Console.WriteLine("輸出引用引數的最終值   : {0}", num);

           OutParameter(num, out num);
           Console.WriteLine("輸出引數的最終值       : {0}", num);

           int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
           ArrPatameter(arr);
           Console.WriteLine("輸出陣列引數的和       : {0}", ArrPatameter(arr));
           Console.ReadKey();

       }
   }

在學習的吸收轉化率中,主動學習遠高於被動學習,而主動學習中最高的是教授給他人(90%轉化率),希望我所寫的能被更多人所接受,一起成長!
在這裡插入圖片描述