# C#學習筆記
1. **Console.Read功能**
拿來讀取字串自首的ASCII碼,ex:輸入5,讀到的是5的ASCII碼**53**
2. **partal**功能
一部分的程式放在某個專案,一部分放在其他專案
3.
```c#
//不太建議只使用button1命名,因為寫程式到最後會搞不清楚他是誰
button1_start.Text = "123";
```
4.
```c#
//按button1_start按鈕時,會執行下方程式,跑出下列敘述
private void button1_start_Click(object sender, EventArgs e)
{
MessageBox.Show("button1_start has been clicked.");
}
```
5. 
6. 第一行程式

7. **static void Main(string[] args){你的程式碼}進入點寫法**
:::info
* static: 一般類別中的方法必須先建立該類別的實體物件(new)後才能使用。若宣告為static,代表一開始就存在在記憶體中,不用先建立Main()的物件實體就能叫用。
* void:表示不會傳回任何值。
* Main():為程式開始執行的進入點,跟JAVA、C、C++相同,Main必須是static。
* string[] args:代表執行Main()方法時會將接在專案執行檔後面的參數置入 args 陣列。args是一個字串陣列。
:::
8. 此功能類似hackmd裡的:::spoiler :::
:::info
#region **收闔後的名子**
要收合的程式碼寫這
#endregion
:::
9. **const**
一經宣告就不會變動的值
const 資料型別 變數名稱 = 內容
10. **var**
使用var宣告的變數,會自動判斷資料型別。
var a=1;//自動將a定義為int
var b="hello";//自動將b定義為string
11. **Parse用法**
string a = "1234";
int b = int.Parse(a);//把a這個字串轉成int
12. **static修飾詞**
可以直接透過class名稱呼叫出來
ex:class Math
{
public int max(int a, int b)
{
if(a>b){answer = a}
}
}
可以直接用Math.max,不用每次都new一個新的物件去呼叫max
如果class student裡有一個變數叫做及格分數,把及格分數用static修飾的話,每個 學生的及格分數都一樣,也可以直接透過student.及格分數去呼叫出來
13. **this.** 可以看做成 **這個物件的**
14. 宣告二維振列
:::info
例如,如果要宣告一個 int 類型的 3x3 二維陣列,可以使用以下代碼:
int[,] myArray = new int[3, 3];
這會創建一個名為 myArray 的 3x3 int 類型的二維陣列。要訪問這個二維陣列中的 元素,可以使用 arrayName[rowIndex, columnIndex] 的形式,其中 rowIndex 是元素的行索引,columnIndex 是元素的列索引。
例如,要設置第一行第二列的元素為 10,可以使用以下代碼:
myArray[0, 1] = 10;
這樣就會將第一行第二列的元素設置為 10。
:::
15. **FindObjectOfType(typeof(T))** 是一個 Unity 引擎的靜態方法,用於尋找場景中第一個符合指定類型 T 的物件。該方法會返回一個 Object 類型的物件,因此需要使用 as 運算子進行類型轉換,將其轉換為 T 類型的物件。
16. **Awake()** 是一個 MonoBehaviour 的生命週期方法之一,用於當腳本被加載時進行初始化。Awake() 方法在該腳本所在的遊戲物件被啟用前就會被調用,且只會被調用一次。
17. **介面 (Interface)**
另外在這個介面上新增一個方法,原因是如果原本有兩個class繼承某一個(0)class, 但其中一個class要用到一個方法而另一個不用,就可以額外使用一個介面 (Interface),裡面放要用的方法,然後要用的物件再多繼承這個介面 (Interface)
*注意:一個class只可以繼承一個class,但是可以繼承多個介面 (Interface)*
https://youtu.be/ODrhZ1v63-s
18. 在 **IComparable.CompareTo** 方法中,返回值的含义如下:
如果当前对象小于比较对象,则返回一个负整数(通常是-1)。
如果当前对象等于比较对象,则返回零。
如果当前对象大于比较对象,则返回一个正整数(通常是1)。
这个规则是为了确保 CompareTo 方法的一致性和可比性。当使用排序算法或集合类时,这些值将被用来确定对象在序列中的顺序。
如果返回值是其他整数,可能会破坏排序的规则和一致性,导致不可预知的结果。因此,只有 -1、0、1 这三种返回值才能确保 CompareTo 方法的正确运行。
19. :::info
C# unity中 我有一個cube的話,然後我從x,z方向看的話它是正方形,我可不可以取到它的正方形端點(x,z)
ChatGPT
可以。你可以使用 Transform 的 position 屬性取得 cube 的中心點位置,然後使用 Transform 的 lossyScale 屬性取得其在世界空間中的縮放值。然後就可以算出正方形四個端點的位置。
假設 cube 的中心點位置是 centerPos,x 軸縮放值是 scaleX,z 軸縮放值是 scaleZ,那麼正方形四個端點的位置分別是:
左上角:new Vector3(centerPos.x - scaleX / 2f, centerPos.y, centerPos.z + scaleZ / 2f)
右上角:new Vector3(centerPos.x + scaleX / 2f, centerPos.y, centerPos.z + scaleZ / 2f)
左下角:new Vector3(centerPos.x - scaleX / 2f, centerPos.y, centerPos.z - scaleZ / 2f)
右下角:new Vector3(centerPos.x + scaleX / 2f, centerPos.y, centerPos.z - scaleZ / 2f)
以上的程式碼中,new Vector3 代表建立一個新的 Vector3 物件,三個參數分別代表 x、y、z 座標。
:::
20. **Override 複寫**
讓你改寫繼承到的行為
換句話說:改寫掉原本method的行為
:::info
原本村民繼承到(class 生物)的行為是可以攻擊的,使其變得不行攻擊。
:::
* 在被改寫的method前加上virtual
* 在改寫人家的method前加上override
* override的method其名稱與參數型別都要跟被override的相同
:::spoiler example
```c#=
class Creature
{
public virtual string attack(Creature target)
{
return name + "攻擊了" + target.name;
}
}
```
```c#=
class Villager:Creature
{
public override string attack(Creature target)
{
return "不能攻擊";
}
}
```
:::
**問題**
:::info
寫新的method也能夠做到剛剛的事情,那為什麼需要override?
Ans:如果使用base class的變數仍可以呼叫到被override的method
:::