C#初階教學2

延續C#初階教學教學文件

類別與物件 (class, object)

「類別」是 C# 最基本的型別。 類別是以單一單位結合狀態 (欄位) 和動作 (方法及其他函式成員) 的資料結構。 類別可以為動態建立的類別「執行個體」(稱為「物件」) 提供定義。 類別支援「繼承」和「多型」,這些是可供「衍生類別」將「基底類別」延伸及特製化的機制。

宣告一個Person類別

    class Program
    {
        public class Person //類別
        {
            /// <summary>
            /// 年齡
            /// </summary>
            public int Age { get; set; } //屬性

            /// <summary>
            /// 增加年齡
            /// </summary>
            /// <param name="age">要增加的年齡</param>
            public void AgeAdd(int age) //方法
            {
                this.Age += age;
            }
        }

        static void Main(string[] args)
        {
        }
    }

上面看到我們宣告了一個Person類別,裡面包含了屬性以及方法。接著我們把他建立成一個物件並且存取這個類別提供的方法與屬性

    var man = new Person(); //建立man物件,為Person類別
    man.Age = 10; //將man物件的Age設為10
    Console.WriteLine(man.Age)
    man.AgeAdd(10); //呼叫增加年齡方法
    Console.WriteLine(man.Age)
    Console.ReadLine();

存取範圍層級

使用存取修飾詞 public、protected、internal 或 private 來指定成員的下列其中一個已宣告存取範圍層級。

已宣告存取範圍 意義
public 未限制存取
protected 存取限於包含類別或衍生自包含類別的類型
internal 存取限於目前組件
private 存取限於包含類型

繼承

宣告Man類別繼承Person,類別繼承可以使用父類別的屬性與方法(private除外)

    public class Man : Person //繼承Person
    {
        public int Length { get; set; }
    }

宣告的Man類別依然可以使用Person類別的值與方法

    var man = new Man(); //建立man物件,為Person類別

    man.Age = 10; //將man物件的Age設為10
    Console.WriteLine(man.Age)
    man.AgeAdd(10); //呼叫
    Console.WriteLine(man.Age)
    man.Lenght = 30;
    Console.WriteLine(man.Lenght)
    Console.ReadLine();

結構(struct)

跳過

陣列(array)

陣列是一種資料結構,其中包含一些可透過計算索引存取的變數。 陣列中包含的變數 (也稱為陣列的元素) 屬於相同的型別,這種型別稱為陣列的元素型別。

而陣列變數的宣告只是預留空間給陣列執行個體的參考。 實際的陣列執行個體是執行階段期間使用 New 運算子動態建立。 新增作業會指定新陣列執行個體的長度,這在該執行個體的存留期是固定的。

    int[] a = new int[10];
    for (int i = 0; i < a.Length; i++)
    {
        a[i] = i * i;
    }
    for (int i = 0; i < a.Length; i++)
    {
        Console.WriteLine($"a[{i}] = {a[i]}");

    int[] a1 = new int[10]; //一維
    int[,] a2 = new int[10, 5]; //二維
    int[,,] a3 = new int[10, 5, 2]; //三維
    //不規則陣列
    int[][] r = new int[3][];
    r[0] = new int[10];
    r[1] = new int[5];
    r[2] = new int[20];
    //直接賦予初始值
    int[] init = new int[] { 1, 2, 3 };
    int[] init2 = { 1, 2, 3 };
    Console.ReadLine();

#介面(interface)

「介面」定義可由類別和結構實作的合約。 介面可以包含方法、屬性、事件和索引子。 介面不提供它所定義之成員的實作 (它只會指定必須由類別提供的成員或實作介面的結構)。

介面可以採用「多重繼承」

下面宣告一個介面和繼承他的類別

    public interface Person
    {
        void AddAge();
    }

    public class Man : Person//Man 繼承 Person介面
    {
        public void AddAge() //必須實作介面定義的方法
        {
            throw new NotImplementedException();
        }
    }

介面的作用可以用來定義物件開發的規範,也可以用來降低程式耦合來達到軟體設計的高內聚,低耦合(high cohesion、low coupling)概念。

列舉(enum)

「列舉型別」是含一組具名常數的相異實值型別。 當您需要定義可擁有一組離散值的型別時,便可定義列舉。 它們使用其中一個整數值型別作為其基礎儲存體。 它們會為離散值提供語意意義。

    enum PersonType //PersonType列舉
    {
        Child, //0
        Young, //1
        Big, //2
        Old //3
    }
    static void Main(string[] args)
    {
        var type = PersonType.Big;
        Console.WriteLine($"PersonType enum = {(int)type}");
        switch(type)
        {
            case PersonType.Child:
                Console.WriteLine("Chile");
                break;
            case PersonType.Young:
                Console.WriteLine("Young");
                break;
            case PersonType.Big:
                Console.WriteLine("Big");
                break;
            case PersonType.Old:
                Console.WriteLine("Old");
                break;
        }
        Console.ReadLine();
    }

每個 enum 型別都有對應的整數型別,稱為 enum 型別的「基礎型別」。 未明確宣告基礎型別的 enum 型別會擁有 int 基礎型別。

enum Alignment: sbyte //使用sbyte當作enum型別
{
    Left = -1,
    Center = 0,
    Right = 1
}

enum 成員宣告可以包含會指定成員值的常數運算式。 每個 enum 成員的常數值都必須在 enum 的基礎型別範圍內。 當 enum 成員宣告並未明確指定值時,賦予成員的值會是零 (如果它是 enum 型別中的第一個成員) 或是本文上前面 enum 成員的值加 1。

int i = (int)PersonType.Big;    // int i = 2;
PersonType c = (PersonType)2;   // PersonType cPersonType.Big;  
Console.ReadLine();

委派(delegate)

跳過

C#命名方針(Coding Standard)

大小寫慣例

若要區分識別項中的文字,將變成大寫識別項中的每個單字的第一個的字母。 請勿使用底線來區分文字,或該項目的,識別項中的任何位置。 有兩個適當的方法可以改為大寫的識別項,根據所使用的識別項:

  • PascalCasing
  • camelCasing

特殊案例對兩個字母縮略字,這兩個字母都大寫,如下列的識別項中所示:

IOStream

三個以上則使用Pascal

XmlString

基本上Field (Private)(加上底線) _name,Local Variable,Parameter是用camel命名,其他都是用pascal

一般命名慣例

✓ 選擇簡單易讀的識別項名稱。

例如,名為的屬性HorizontalAlignment是英文-可讀性比AlignmentHorizontal。

✓ 勝過求簡單明瞭的可讀性。

屬性名稱CanScrollHorizontally優於ScrollableX(x 軸之下參考)。

X 不使用底線、 連字號或任何其他非英數字元。

X 不使用匈牙利標記法。

X 不縮寫做為識別項名稱的一部分。

例如,使用GetWindow而不是GetWin。

✓ 語意方面有意義的名稱,而不是語言特有的關鍵字用於型別名稱。

例如,GetLength是更適合的名稱,比GetInt。

Interface 使用前置詞”I”

Property 避免使用”Get”或”Set”當前置詞

相關文章

C#初階教學