1. 程式人生 > >【SIKIA計劃】_04_C#中級教程 (2015版)筆記

【SIKIA計劃】_04_C#中級教程 (2015版)筆記

IKIC#中級教程 (2015版)

正常模式指的是不會影響程式的正常執行。

1,在VS中我們使用Console.Write(或者WriteLine)方法向控制檯輸出變數的值,通過這個我們可以檢視變數的值是否符合我們的預期來除錯錯誤。

2,在Unity中我們使用Debug.Log("") Debug.LogError("") Debug.LogWarn(""),向unity的Console視窗輸出資訊,幫助我們除錯錯誤。

 

Sytem.SystemException類的預定義的異常類

System.IO.IOException處理 I/O 錯誤。

System.IndexOutOfRangeException處理當方法指向超出範圍的陣列索引時生成的錯誤。System.ArrayTypeMismatchException處理當陣列型別不匹配時生成的錯誤。System.NullReferenceException處理當依從一個空物件時生成的錯誤。System.DivideByZeroException處理當除以零時生成的錯誤。

System.InvalidCastException處理在型別轉換期間生成的錯誤。

System.OutOfMemoryException處理空閒記憶體不足生成的錯誤。

System.StackOverflowException處理棧溢位生成的錯誤。

 

try

while(true)

{

try{ num1 = Convert.ToInt32(Console.ReadLine());

break;

}catch{

Console.writeLine("你輸入的不是一個整數,請重新輸入");

}

//break;//把break放在這裡的話,不管釋出發生異常都會執行,因為try對異常進行了處理

}

 

建立使用者自定義異常

using System;

namespace UserDefinedException

{

class TestTemperature

{

static void Main(string[] args)

{

Temperature temp = new Temperature();

try

{

temp.showTemp();

}

catch(TempIsZeroException e)

{

Console.WriteLine("TempIsZeroException: {0}", e.Message);

}

Console.ReadKey();

}

}

}

public class TempIsZeroException: ApplicationException

{

public TempIsZeroException(string message): base(message)

{

}

}

public class Temperature

{

int temperature = 0;

public void showTemp()

{

if(temperature == 0)

{

throw (new TempIsZeroException("Zero Temperature found"));

}

else

{

Console.WriteLine("Temperature: {0}", temperature);

}

}

}

 

物件

建構函式

使用我們自定義的類宣告的變數也叫做物件,這個過程也叫做例項化。

ClassName myClass = new ClassName();

其中ClassName是我們定義的類的名字,myClass是我們宣告的變數(物件)的名字,後面的new是一個關鍵字,使用new 加上型別名()表示對該物件進行構造,如果不進行構造的話,這個物件是無法使用的。

 

解構函式

class Line { private double length; // 線條的長度 public Line() // 建構函式 { Console.WriteLine("物件已建立"); }~Line()//解構函式 { Console.WriteLine("物件已刪除"); }

 

成員函式和封裝

  • Public:所有物件都可以訪問;
  • Private:物件本身在物件內部可以訪問;
  • Protected:只有該類物件及其子類物件可以訪問
  • Internal:同一個程式集的物件可以訪問;
  • Protected internal:一個程式集內的物件,或者該類物件及其子類可以訪問;

 

我們習慣上把欄位設定為私有的,這樣外界不能修改欄位的值,然後我們可以通過定義屬性來設定和取得欄位中的值。

private int age;

public int Age{//習慣上屬性大寫 欄位小寫

  set{

  if(value<0)return;

  age = value;

  }

  get{

  return age;

  }

}

 

靜態成員

 static

 

匿名型別

我們建立變數(物件的時候),必須指定型別,其實我們也可以不去指定型別,這個就是匿名型別,我們可以使用var宣告一個匿名型別。

使用var宣告的匿名型別,當初始化的時候,這個變數的型別就被確定下來,並且以後不可以修改。

 var  var1 = 34;

 

繼承

虛方法

把一個基類函式宣告為virtual,就可以在任何派生類中重寫該函式:

  class MyBaseClass{

  public virtual string VirtualMethod(){

  return "Method is called in base class";

  }

  }

在派生類中重寫另外一個函式時,要使用override關鍵字顯示宣告

  class MyDerivedClass:MyBaseClass{ 

  public override string VirtualMethod(){

  return "Method is called in derivedclass.";

  }

  }

 

隱藏方法

如果簽名相同的方法在基類和派生類中都進行了宣告,但是該方法沒有分別宣告為virtual和override,派生類就會隱藏基類方法。(要使用new關鍵字進行宣告)

基類

class MyBaseClass{

  public int MyMethod(){

  }

}

派生類(在派生類中把基類同名的方法隱藏掉了)

class MyDerivedClass :MyBaseClass{

  public new void MyMethod()        {

          }   

}

 

過載:同一個作用域內發生(比如一個類裡面),定義一系列同名方法,但是方法的引數列表不同。這樣才能通過傳遞不同的引數來決定到底呼叫哪一個。而返回值型別不同是不能構成過載的。

重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的 

        例如:基類方法宣告為virtual(虛方法),派生類中使用override申明此方法的重寫.

隱藏:基類方法不做申明(預設為非虛方法),在派生類中使用new宣告此方法的隱藏。

過載時,根據引數選擇呼叫的方法;

重寫時,訪問父類子類皆呼叫子類的重寫方法;

隱藏時,訪問父類則呼叫父類的方法,子類子類的方法。

 

this和base關鍵字

 

C#允許把類和方法宣告為 sealed。 對於類 ,這表示不能繼承該類;對於方法表示不能重寫該方法。

 

定義介面(飛翔功能)

  public interface IFlyHandler{

  public void Fly();

  }

實現介面

  public class Type1Enemy:IFlyHandler{

  }

定義一個介面在語法上跟定義一個抽象類完全相同,但不允許提供介面中任何成員的實現方式,一般情況下,介面只能包含方法,屬性,索引器和事件的宣告。

介面不能有建構函式,也不能有欄位,介面也不允許運算子過載。

介面定義中不允許宣告成員的修飾符,介面成員都是公有的

 

抽象基類與介面,共性與個性的選擇!

C#中的抽象基類(AbstractClass)和介面(Interface)都實現了面向物件中的繼承機制,它們通過定義抽象方法勻實現了對繼承類的功能上的約束,那麼在如何在恰當的場景選擇恰當的繼承機制是我們在設計中經常會遇到的問題,我們先來對比兩者之間的區別與聯絡。

相同點

  • 都可以被繼承。
  • 本身都不能被例項化

不同點

  • 抽象類是一個不完整的類,需要進一步細化;而介面只是一個行為上的規範。
  • 抽象基類不能實現多繼承,而介面可以實現多繼承。
  • 抽象基類可以定義欄位、屬性、包含有實現的方法。介面可以定義欄位、索引器、事件但不能定義欄位和包含實現的方法。  

 

1,建立列表(列表可以儲存任何型別的資料,在建立列表物件的時候首先要指定你要建立的這個列表要儲存什麼型別的)(泛型)

  List<int> scoreList = new List<int>();

  new List<int>(){1,2,3}

  new List<string>(){"one","two"}

  var scoreList = new List<int>();

 

2,往列表中插入資料

  scoreList.Add(12);

  scoreList.Add(45);

3,如何取得列表中的資料?列表中的資料跟陣列有點相似,索引從0開始 ,可以通過索引來訪問

  scoreList[0] //訪問新增到列表中的第一個資料

 

使用泛型和索引器來實現一個我們自己的集合類MyList

1,Capacity獲取容量大小

2,Add()方法新增元素

3,Insert()方法插入元素

4,[index]訪問元素(索引器)

5,Count屬性訪問元素個數

6,RemoveAt()方法移除指定位置的元素

7,IndexOf()方法取得一個元素所在列表中的索引位置

   LastIndexOf()上面的方法是從前往後搜尋,這個是從後往前搜尋,搜尋到滿足條件的就停止

  上面的兩個方法,如果沒有找到指定元素就返回-1

8,Sort()對列表中是元素進行從小到大排序