# 30509黃緯廷的C#筆記
## 0.前情提要
* ==**由於本人為程式語言初學者,此份筆記為我高中自主學習計畫,筆記一切內容由本人觀看學習影片後自行統整,因此內容可能有疏漏或是不完善、錯誤、用字不精準之部分,若有建議,可留言告知,望海涵,謝謝。**==
## 1.自主學習參考影片
* [【C#】3小時初學者教學 |Csharp | C# 教學 | C# 入門 | C++++](https://www.youtube.com/watch?v=T9BeejD3i0g&t=0s)
## 2.環境建置、第一支程式
* 本次自主學習使用==Visual Studio 2022==當作開發環境
```csharp=
System.Console.WriteLine("Hello World!");
```
## 3.常見資料型態 & 變數
### a.常見資料型態一覽
* 字串 例:string"您好"
* 字串==需用" "==
* 字元 例:char'a'
* 字元==需用' '==
* 整數 例:int 100
* 浮點數 例:double 1.5
* 布林值 例:bool ture false
Visual Studio頁面截圖1

Visual Studio輸出截圖1

### b.指定變數
* 範例
```csharp=
string name = "黃緯廷";
```
:::warning
* string為變數的==資料型態==。
* name為變數的==名稱==。
* "黃緯廷"為==變數內容==。
:::
:::danger
* ==變數內容==可中途改變。
* ==資料型態==不可中途改變。
:::
### c.變數自介
```csharp=
//姓名 黃緯廷
string name = "黃緯廷";
System.Console.WriteLine("姓名"+name);
//性別 M(Male)
char sex = 'M';
System.Console.WriteLine("性別"+sex);
//年紀 18
int age = 18;
System.Console.WriteLine("年紀"+age);
//身高 158.9
double high = 158.9;
System.Console.WriteLine("身高"+high);
//是女性? 否
bool is_female = false;
System.Console.WriteLine("是女性"+is_female);
```
Visual Studio頁面截圖2

Visual Studio輸出截圖2

## 4.字串常見用法
### a.\n換行
:::success
* \n為換行作用。
:::
```csharp=
//單程式內換行
System.Console.WriteLine("Hellow \nWorld!");
```
Visual Studio頁面截圖3

Visual Studio輸出截圖3

### b.利用反斜線告知特殊符號為字串內容
```csharp=
//利用反斜線告知符號為字串
System.Console.WriteLine("\"Hellow\" \'World!\'");
```
Visual Studio頁面截圖4

Visual Studio輸出截圖4

### c.字串相加
```csharp=
//字串相加
System.Console.WriteLine("Hellow" + "World!");
```
Visual Studio頁面截圖5

Visual Studio輸出截圖5

### d.Length判別字串長度
:::success
* Length可判別字串長度。
:::
```csharp=
//判別長度
System.Console.WriteLine("Hellow World!".Length);
```
Visual Studio頁面截圖6

Visual Studio輸出截圖6

### e.ToUpper/ToLower轉換大小寫
:::success
* ToUpper可轉換大寫。
* ToLower可轉換小寫。
:::
```csharp=
//轉換大寫
System.Console.WriteLine("Hellow World!".ToUpper());
//轉換小寫
System.Console.WriteLine("Hellow World!".ToLower());
```
Visual Studio頁面截圖7

Visual Studio輸出截圖7

### f.Contains判斷字串中是否含有指定內容
:::success
* Contains可判斷字串中是否含有指定內容。
:::
```csharp=
//判斷字串中是否含有指定內容
System.Console.WriteLine("Hellow World!".Contains("Hellow"));
```
Visual Studio頁面截圖8

Visual Studio輸出截圖8

:::warning
* 若無指定內容則判斷False。
:::
### g.判斷字串中特定位置的值
```csharp=
//判斷字串中特定位置的值([0]表第1位),因此[1]會表示第2位。
System.Console.WriteLine("Hellow World!"[1]);
```
Visual Studio頁面截圖9

Visual Studio輸出截圖9

:::danger
* 在C#中[0]表第1位,因此[1]會表示第2位。
:::
### h.IndexOf判斷字串中特定值的位置
:::success
* IndexOf可判斷字串中特定值的位置。
:::
#### h1.判斷字串中特定值的位置
```csharp=
//判斷字串中特定值的位置
System.Console.WriteLine("Hellow World!".IndexOf("H"));
```
Visual Studio頁面截圖10

Visual Studio輸出截圖10

#### h2.判斷字串中重複特定值的位置
```csharp=
//判斷字串中重複特定值的位置
System.Console.WriteLine("Hellow World!".IndexOf("l"));
```
Visual Studio頁面截圖11

Visual Studio輸出截圖11

:::danger
* 若欲尋找之值在目標字串中有重複,則優先傳回較先檢索到之值位置。如欲尋找l,則會傳回2而非3。
:::
#### h3.判斷字串中特定字串的位置
```csharp=
//判斷字串中特定字串的位置
System.Console.WriteLine("Hellow World!".IndexOf("World"));
```
Visual Studio頁面截圖12

Visual Studio輸出截圖12

:::danger
* 若欲尋找之值為字串,則傳回搜尋目標中字串開頭之位置。如欲尋找World,則傳回7。
:::
#### h4.判斷字串中不存在之字串的位置
```csharp=
//判斷字串中不存在之字串的位置
System.Console.WriteLine("Hellow World!".IndexOf("Yes"));
```
Visual Studio頁面截圖13

Visual Studio輸出截圖13

:::danger
* 若目標中無欲搜尋之目標,則傳回-1。
:::
### i.Substring切割字串
:::success
* Substring可切割字串。
:::
#### i1.切割字串
```csharp=
//切割字串
System.Console.WriteLine("Hellow World!".Substring(7));
```
Visual Studio頁面截圖14

Visual Studio輸出截圖14

#### i2.切割字串至指定位置
```csharp=
//切割字串至指定位置
System.Console.WriteLine("Hellow World!".Substring(7, 3));
```
Visual Studio頁面截圖15

Visual Studio輸出截圖15

:::danger
* 括號中第二個數字表由第一數字位置往後計算的位數。如Substring(7, 3)表由第7個位置後切割到後3個字。
:::
## 5.數字常見用法(整數、浮點數)
### a.四則運算
#### a1.整數與浮點數四則運算
```csharp=
//整數加法
System.Console.WriteLine(2 + 3);
//整數減法
System.Console.WriteLine(2 - 3);
//整數乘法
System.Console.WriteLine(2 * 3);
//整數除法
System.Console.WriteLine(2 / 3);
```
Visual Studio頁面截圖16

Visual Studio輸出截圖16

:::danger
* 由於是整數2與整數3之間的運算,因此輸出結果僅為0.6循環小數中的整數部分0。
* 若要輸出浮點數,只需將其中一邊整數改為浮點數即可。
```csharp=
//浮點數除法
System.Console.WriteLine(2.0 / 3);
```
Visual Studio頁面截圖17

Visual Studio輸出截圖17

:::
#### a2.連續四則運算
```csharp=
//先乘除後加減
System.Console.WriteLine(2 + 3 * 5);
//括號內先算
System.Console.WriteLine((2 + 3) * 5);
```
Visual Studio頁面截圖18

Visual Studio輸出截圖18

### b.常用數學方法
:::success
* Abs可取絕對值。
* Pow可取次方。
* Sqrt可開根號。
* Max可取較大值。
* Min可取較小值。
* Round可將浮點數四捨五入。
:::
```csharp=
//絕對值
System.Console.WriteLine(System.Math.Abs(-10));
//次方
System.Console.WriteLine(System.Math.Pow(10,3));
//開根號
System.Console.WriteLine(System.Math.Sqrt(16));
System.Console.WriteLine(System.Math.Sqrt(8));
//取較大值
System.Console.WriteLine(System.Math.Max(2,100));
//取較小值
System.Console.WriteLine(System.Math.Min(2, 100));
//浮點數四捨五入
System.Console.WriteLine(System.Math.Round(5.4));
System.Console.WriteLine(System.Math.Round(5.5));
```
Visual Studio頁面截圖19

Visual Studio輸出截圖19

:::danger
* 次方的使用中,第一個數為底數,第二個數為次方的值。
:::
## 6.取得用戶輸入
### a.用戶輸入
:::success
* ReadLine可要求用戶端輸入。
:::
```csharp=
//提示用戶輸入名字
System.Console.WriteLine("請輸入您的名字:");
//取得用戶輸入
System.Console.ReadLine();
//提示用戶輸入名字(不換行)
System.Console.Write("請輸入您的名字:");
//取得用戶輸入
System.Console.ReadLine();
```
Visual Studio頁面截圖20

Visual Studio輸出截圖20

:::danger
* 去掉WriteLine中的Line可拒絕換行
:::
### b.用戶輸入變數
```csharp=
//提示用戶輸入名字
System.Console.Write("請輸入您的名字:");
//取得用戶輸入 將變數name設為用戶輸入
string name = System.Console.ReadLine();
//輸出歡迎你+用戶名
System.Console.WriteLine("歡迎您" + name + "先生");
```
Visual Studio頁面截圖21

Visual Studio輸出截圖21

:::danger
* 當然也可同時取得多個輸入。
```csharp=
//提示用戶輸入名字
System.Console.Write("請輸入您的名字:");
//取得用戶輸入 將變數name設為用戶輸入
string name = System.Console.ReadLine();
//提示用戶輸入年紀
System.Console.Write("請輸入您的年紀:");
//取得用戶輸入 將變數age設為用戶輸入
string age = System.Console.ReadLine();
//輸出歡迎你+用戶名
System.Console.WriteLine("歡迎您" + age + "歲的" + name + "先生");
```
Visual Studio頁面截圖22

Visual Studio輸出截圖22

:::
### c.建立基礎計算機
:::success
* Convert可改變資料型態。
* ToInt32可指定改變資料型態為整數。
* ToDouble可指定改變資料型態為浮點數。
:::
#### c1.整數加法計算機
```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
int num1 = System.Convert.ToInt32(System.Console.ReadLine());
//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
int num2 = System.Convert.ToInt32(System.Console.ReadLine());
System.Console.WriteLine(num1 + num2);
```
Visual Studio頁面截圖23

Visual Studio輸出截圖23

#### c2.浮點數加法計算機
```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
double num1 = System.Convert.ToDouble(System.Console.ReadLine());
//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
double num2 = System.Convert.ToDouble(System.Console.ReadLine());
System.Console.WriteLine(num1 + num2);
```
Visual Studio頁面截圖24

Visual Studio輸出截圖24

## 7. Array 陣列
### a.創建陣列
```csharp=
//創建整數陣列
int[] scores = {60, 90, 75, 46, 89};
//輸出陣列內容
System.Console.WriteLine(scores[0]);
System.Console.WriteLine(scores[1]);
System.Console.WriteLine(scores[2]);
System.Console.WriteLine(scores[3]);
System.Console.WriteLine(scores[4]);
```
Visual Studio頁面截圖25

Visual Studio輸出截圖25

### b.中途改變陣列內容
```csharp=
//創建整數陣列
int[] scores = {60, 90, 75, 46, 89};
//改變第一位分數為65
scores[0] = 65;
//輸出陣列內容
System.Console.WriteLine(scores[0]);
System.Console.WriteLine(scores[1]);
System.Console.WriteLine(scores[2]);
System.Console.WriteLine(scores[3]);
System.Console.WriteLine(scores[4]);
```
Visual Studio頁面截圖26

Visual Studio輸出截圖26

### c.創建空陣列
```csharp=
//創建字串空陣列,指定陣列內可容納4個值
string[] ages = new string[4];
//設定陣列內容
ages[0] = "18";
ages[1] = "23";
ages[2] = "57";
ages[3] = "69";
System.Console.WriteLine(ages[0]);
System.Console.WriteLine(ages[1]);
System.Console.WriteLine(ages[2]);
System.Console.WriteLine(ages[3]);
```
Visual Studio頁面截圖27

Visual Studio輸出截圖27

:::danger
```csharp=
//創建字串空陣列,指定陣列內可容納4個值
string[] ages = new string[4];
```
* 此式中之中括號[指定陣列內可容納之值之數量]不是由0開始計算!
:::
## 8.If(else)判斷句
### a.if判斷
```csharp=
//設置變數為true
bool hungry = true;
//如果變數為true
if (hungry)
//輸出
{
System.Console.WriteLine("我就去吃飯");
}
```
Visual Studio頁面截圖28

Visual Studio輸出截圖28

### b.if, else判斷
```csharp=
//設置變數為false
bool rainy = false;
//如果變數為true
if (rainy)
//輸出
{
System.Console.WriteLine("我就坐車去上學");
}
//若非,則輸出
else
{
System.Console.WriteLine("我就走路去上學");
}
```
Visual Studio頁面截圖29

Visual Studio輸出截圖29

### c.巢狀選擇
```csharp=
//設置變數(分數=40)
int score = 40;
//若分數為100
if (score == 100)
//輸出
{
System.Console.WriteLine("Your grade is A!");
}
//或是如果分數為80
else if (score >= 80)
//輸出
{
System.Console.WriteLine("Your grade is B!");
}
//或是如果分數為60
else if (score >= 60)
//輸出
{
System.Console.WriteLine("Your grade is C!");
}
//否則
else
{
System.Console.WriteLine("Your grade is D!");
}
```
Visual Studio頁面截圖30

Visual Studio輸出截圖30

### d.且&&
```csharp=
//設置變數(分數=100,畢業=否)
int score = 100;
bool graduation = false;
//若滿足兩個條件(且)
if (score == 100 && graduation)
//輸出
{
System.Console.WriteLine("我給你10000元獎金");
}
//若其一不滿足,則輸出
else
{
System.Console.WriteLine("重修高中");
}
```
Visual Studio頁面截圖31

Visual Studio輸出截圖31

### e.或||
```csharp=
/設置變數(分數=100,畢業=否)
int score = 100;
bool graduation = false;
//若滿足其一條件(或)
if (score == 100 || graduation)
//輸出
{
System.Console.WriteLine("我給你10000元獎金");
}
//否則
else
{
System.Console.WriteLine("重修高中");
}
```
Visual Studio頁面截圖32

Visual Studio輸出截圖32

### f.不等於!=
```csharp=
//設置變數(分數=100,畢業=否)
int score = 100;
bool graduation = false;
//若不滿足兩個條件(且)
if (score != 100 && !graduation)
//輸出
{
System.Console.WriteLine("重修高中");
}
//若其一滿足,則輸出
else
{
System.Console.WriteLine("我給你10000元獎金");
}
```
Visual Studio頁面截圖33

Visual Studio輸出截圖33

## 9.進階計算機
```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
double num1 = System.Convert.ToDouble(System.Console.ReadLine());
System.Console.Write("請輸入要做的運算:");
string oper = System.Console.ReadLine();
//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
double num2 = System.Convert.ToDouble(System.Console.ReadLine());
if (oper == "+")
{
System.Console.WriteLine(num1 + num2);
}
else if (oper == "-")
{
System.Console.WriteLine(num1 - num2);
}
else if (oper == "*")
{
System.Console.WriteLine(num1 * num2);
}
else if (oper == "/")
{
System.Console.WriteLine(num1 / num2);
}
else
{
System.Console.Write("不合法的運算符號");
}
```
## 10.While迴圈
### a.while基礎用法
```csharp=
//設置變數為1
int num = 1;
//當變數小於5
while (num <= 5)
//加1直到5
{
System.Console.WriteLine(num);
num = num+1;
}
```
Visual Studio頁面截圖34

Visual Studio輸出截圖34

### b. do, while先執行再判斷
```csharp=
int num = 6;
do
{
System.Console.WriteLine(num);
num = num + 1;
}
```
Visual Studio頁面截圖35

Visual Studio輸出截圖34

## 11.猜數字遊戲
```csharp=
//設置變數
//答案
int answer = 89;
//玩家猜測的答案
int guess = 0;
//玩家猜測次數
int guess_counts = 0;
//猜測次數限制
int guess_limit = 5;
//目前獲勝狀況
bool win = false;
//告知玩家遊戲玩法
System.Console.WriteLine("猜數字遊戲,請輸入整數,我會告訴你答案更大或更小!");
//先執行
do
{
//告知玩家動作
System.Console.Write("請輸入猜測:");
//將玩家回應之答案字串轉為整數
guess = System.Convert.ToInt32(System.Console.ReadLine());
//玩家猜測次數+1
guess_counts = guess_counts + 1;
//若玩家答案太大
if (guess > answer)
{
//給予對應提示
System.Console.WriteLine("太大");
}
//若玩家答案太小
else if (guess < answer)
{
//給予對應提示
System.Console.WriteLine("太小");
}
//若玩家答案正確
else
{
//給予對應回應
System.Console.WriteLine("恭喜答對!");
win = true;
}
}
//當玩家未勝利且玩家猜測次數未達猜測次數限制,重複以上
while (guess != answer && guess_counts < guess_limit);
//若執行完上述程式,目前獲勝狀況依舊為否
if (win == false)
{
////給予對應回應
System.Console.WriteLine("再接再厲!");
}
```
Visual Studio頁面截圖36~37


Visual Studio輸出截圖36~37


## 12.For迴圈
### a.for基礎用法
```csharp=
//for(設置目標變數;判斷迴圈繼續條件;每次執行完前述迴圈執行)
for (int x = 1; x <= 5; x = x + 1)
{
System.Console.WriteLine(x);
}
```
Visual Studio頁面截圖38

Visual Studio輸出截圖38

### b.取出陣列中的數
```csharp=
//設置陣列
int[] nums = { 3, 4, 5, 6, 8, 10, 5, 12, 13 };
//for(設置i=0;若i小於陣列長度則再次執行;再次執行前i+1)
for (int i = 0; i < nums.Length; i++)
{
//輸出陣列第i位
System.Console.WriteLine(nums[i]);
}
```
Visual Studio頁面截圖39

Visual Studio輸出截圖39

:::danger
* i++與i+=1作用相同於i=i+1。
:::
## 13.二維陣列
### a.創建二維陣列
```csharp=
//設置二維陣列
int[,] nums = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
//寫出第[0]橫排第[0]位
System.Console.WriteLine(nums[0, 0]);
```
Visual Studio頁面截圖40

Visual Studio輸出截圖40

:::danger
* row指的是橫行。
* colume指的是直排。
:::
### b.創建空二維陣列
```csharp=
//設置空二維陣列 [3row, 4colume]
int[,] nums = new int[3, 4];
//宣告[第一橫行,第一直排]值為1
nums[0, 0] = 1;
//宣告[第一橫行,第二直排]值為2
nums[0, 1] = 2;
```
Visual Studio頁面截圖41

Visual Studio輸出截圖41

## 14.class 類別 & object 物件
### a.創建類別(資料型態)
:::success
* 想創建類別,必須對右方專案名稱點擊右鍵,接著點擊加入->新增項目,然後選取類別後命名即可。
Visual Studio方案總管截圖1

Visual Studio新增項目截圖1

:::
### b.創建物件
* 專案Person.cs
```csharp=
//class創建類別接欲創建資料型態名稱
class Person
//大括號內定義此資料型態之屬性
{
public double height;
public int age;
public string name;
}
```
Visual Studio類別專案頁面截圖1

:::warning
* public表示屬性可以在任何地方被存取。
:::
* 專案Program.cs
```csharp=
//由模板創造出來的變數person1稱為物件
Person person1 = new Person();
//設定物件屬性
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
```
Visual Studio頁面截圖42

Visual Studio輸出截圖42

## 15.namespace、using
:::success
* namespace可將模板做分類跟管理。
* using可在一個C#專案內要求程式使用指定namespace的模板。
:::
### a.namespace
* 專案Person.cs
```csharp!
namespace Characters
{
class Person
{
public double height;
public int age;
public string name;
}
}
```
Visual Studio類別專案頁面截圖2

### b.using
* 專案Program.cs
```csharp=
using Characters;
Person person1 = new Person();
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
```
Visual Studio頁面截圖43

Visual Studio輸出截圖43

:::warning
* System是C#中內建的namespace,而Console為其中的class,因此在專案中使用using System;,即可不用在Console前加上System了!
```csharp=
using Characters;
using System;
Person person1 = new Person();
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
Console.WriteLine(person1.height);
Console.WriteLine(person1.age);
Console.WriteLine(person1.name);
```
Visual Studio頁面截圖44

Visual Studio輸出截圖44

:::
## 16.method 方法
:::success
* method方法,就是可以讓我們在class中定義一些功能來使用。
:::
* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp14
{
class Person
{
public double height;
public int age;
public string name;
public void SayHi()
{
Console.WriteLine("你好阿,我叫" + name);
}
public bool IsAdult()
{
if (age >= 18)
{
return(true);
}
else
{
return (false);
}
}
}
}
```
Visual Studio類別專案頁面截圖3

:::danger
* void表示後面的方法不會有回傳值。
:::
* 專案Program.cs
```csharp=
using ConsoleApp14;
Person person1 = new Person();
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
person1.SayHi();
person1.IsAdult();
System.Console.WriteLine(person1.IsAdult());
```
Visual Studio頁面截圖45

Visual Studio輸出截圖45

:::danger
* return會回傳資料到呼叫端。
:::
## 17.Main 方法
:::success
* main方法可以幫助C#知道程式是由何處開始執行的,一般情況下C#會自動幫我們把程式處理好。
:::
```csharp=
class Program
{
static void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
```
Visual Studio頁面截圖46

Visual Studio輸出截圖46

:::warning
* static是屬於class本身的屬性,而非物件的屬性。
:::
## 18.constructor 建構方法
:::success
* constructor 建構方法,當我們每創建一次物件就會被回傳,他可以幫助我們創建重複類型的物件時,幫助設定需要被重複設定的屬性。
:::
### a.創建成功時執行建構方法
* 專案class1.cs
```csharp=
using System;
namespace Characters
{
class Person
{
public double height;
public int age;
public string name;
public Person(string particle)
{
Console.WriteLine("創建成功" + particle);
}
}
}
```
Visual Studio類別專案頁面截圖4

* 專案Program.cs
```csharp=
using Characters;
Person person1 = new Person("第一次,真棒!");
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
Person person2 = new Person("第二次,真好!");
person1.height = 185.6;
person1.age = 16;
person1.name = "小緯";
```
Visual Studio頁面截圖47

Visual Studio輸出截圖47

### b.簡化需重複設定的屬性
* 專案class1.cs
```csharp=
using System;
namespace Characters
{
class Person
{
public double height;
public int age;
public string name;
public Person(double height, int age, string name)
{
this.height = height;
this.age = age;
this.name = name;
}
}
}
```
Visual Studio類別專案頁面截圖5

* 專案Program.cs
```csharp!
using Characters;
Person person1 = new Person(158.9, 18, "小黃");
Person person2 = new Person(185.6, 16, "小緯");
System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
System.Console.WriteLine(person2.height);
System.Console.WriteLine(person2.age);
System.Console.WriteLine(person2.name);
```
Visual Studio頁面截圖48

Visual Studio輸出截圖48

## 19.getter、setter
* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp17
{
class Video
{
public string title;
public string auther;
//影片類型只有四種:教育,娛樂,音樂,其他
private string type;
public Video(string title, string auther, string type)
{
this.title = title;
this.auther = auther;
Type = type;
}
public string Type
{
get { return type; }
set {
if ( value == "教育" || value == "娛樂" || value == "音樂" || value == "其他")
{
type = value;
}
else
{
type = "其他";
}
}
}
}
}
```
Visual Studio類別專案頁面截圖6

* 專案Program.cs
```csharp=
using ConsoleApp17;
using System;
Video video1 = new Video("第一集", "小黃", "教育");
Video video2 = new Video("第二集", "小緯", "搞笑");
Console.WriteLine(video1.Type);
Console.WriteLine(video2.Type);
```
:::warning
* private表示限制屬性只能在class內存取存取。
* 大寫變數Type是小寫type的對外代理人,因為private限制了對type的存取,因此你只能取得大寫Type。
* 當你試圖取得大寫Type,執行期大括號內的程式碼
* get可幫助存取回傳值。
* set可幫我們在判斷後重新設置小寫type的值
* value為我們原先設置在小寫type的值
:::
Visual Studio頁面截圖49

Visual Studio輸出截圖49

## 20.static attribute 靜態屬性
### a.創建class的屬性
* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp18
{
class Video
{
public string title;
public string auther;
public string type;
public static int video_count = 0;
public Video(string title, string auther, string type)
{
this.title = title;
this.auther = auther;
this.type = type;
video_count++;
}
}
}
```
Visual Studio類別專案頁面截圖7

* 專案Program.cs
```csharp=
using ConsoleApp18;
using System;
Console.WriteLine(Video.video_count);
Video video1 = new Video("第一集", "小黃", "教育");
Console.WriteLine(Video.video_count);
Video video2 = new Video("第二集", "小緯", "娛樂");
Console.WriteLine(Video.video_count);
```
Visual Studio頁面截圖50

Visual Studio輸出截圖50

### b.透過物件屬性輸出static
* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp18
{
class Video
{
public string title;
public string auther;
public string type;
public static int video_count = 0;
public Video(string title, string auther, string type)
{
this.title = title;
this.auther = auther;
this.type = type;
video_count++;
}
public int getVideoCount()
{
return video_count;
}
}
}
```
Visual Studio類別專案頁面截圖8

* 專案Program.cs
```csharp=
using ConsoleApp18;
using System;
Video video1 = new Video("第一集", "小黃", "教育");
Console.WriteLine(video1.getVideoCount());
Video video2 = new Video("第二集", "小緯", "娛樂");
Console.WriteLine(video1.getVideoCount());
```
Visual Studio頁面截圖51

Visual Studio輸出截圖51

## 21.static method 靜態方法 & static class 靜態類別
### a.設置一個static method
:::success
* static method就像是一個工具包,不需要創建物件就可以直接執行。
:::
* 專案Tool.cs
```csharp=
using System;
namespace ConsoleApp19
{
class Tool
{
public static void SayHi()
{
Console.WriteLine("Hellow!");
}
}
}
```
Visual Studio類別專案頁面截圖9

* 專案Program.cs
```csharp=
using System;
using ConsoleApp19;
Tool.SayHi();
```
Visual Studio頁面截圖52

Visual Studio輸出截圖52

### b.設置一個static class
:::success
* 因為static method不需要創建物件就可以直接執行,因此可以將它的類別設為靜態,因為它不需要被用於創造物件。
* 當一個類別為static class表示它不需要用於創建物件。
:::
* 專案Tool.cs
```csharp=
using System;
namespace ConsoleApp19
{
static class Tool
{
public static void SayHi()
{
Console.WriteLine("Hellow!");
}
}
}
```
Visual Studio類別專案頁面截圖10

:::danger
* 此時若在專案Program.cs專案中寫Tool tool = new Tool();就會發生錯誤。
:::
## 22.inheritance 繼承
:::success
* 當兩個class的需創建的屬性大部分重疊時,可以使用inheritance來讓較細之項目與主項目重疊部分簡化。
* 用法是在較細之項目後面加上冒號:,接著打出要繼承的主項目名稱。
:::
* 專案Person.cs
```csharp=
using System;
namespace ConsoleApp20
{
class Person
{
public string name;
public int age;
public void PrintName()
{
Console.WriteLine(this.name);
}
public void PrintAge()
{
Console.WriteLine(this.age);
}
}
}
```
Visual Studio類別專案頁面截圖10

* 專案Student.cs
```csharp=
using System;
namespace ConsoleApp20
{
class Student:Person
{
public string school;
public Student(string name, int age, string school)
{
this.name = name;
this.age = age;
this.school = school;
}
public void PrintSchool()
{
Console.WriteLine(school);
}
}
}
```
Visual Studio類別專案頁面截圖11

* 專案Program.cs
```csharp=
using System;
using ConsoleApp20;
Student student1 = new Student("小黃", 18, "北門高中");
Console.WriteLine(student1.name);
Console.WriteLine(student1.age);
Console.WriteLine(student1.school);
student1.PrintName();
student1.PrintAge();
student1.PrintSchool();
```
Visual Studio頁面截圖53

Visual Studio輸出截圖53
