---
# System prepended metadata

title: C#學習筆記

---

# 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. ![](https://i.imgur.com/FgJg3pM.png)
6. 第一行程式
    ![](https://i.imgur.com/bH11Ykp.png)
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
    :::