延續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”當前置詞