深入淺出 C# 4/e 第八章 心得分享


分類

建立時間: 2022年10月6日 21:02
更新時間: 2022年10月17日 22:22

心得

此心得包含第八章、附錄1 第八章、Unity 實驗室 #4
這個章節在說列舉與集合,集合號稱比陣列還好用
新手跟老手的差異(誤): 新手只會用陣列,老手很會用集合
列舉以前在 C 語言的時候有看過,以前叫枚舉
集合的話有點像是鏈結串列,集合一樣要宣告型態
但大小不用宣告,可以輕易地更改大小

CS8600 警告

之前常常看到這個警告,但沒找到理想的解決辦法,於是就暫時忽略

我擷取 動手做! 儲存鞋子的 app 的程式碼

string color = Console.ReadLine();
Shoe shoe = new Shoe((Style)style, color);

你會看到兩個警告
CS8600: 正在將 Null 常值或可能的 Null 值轉換為不可為 Null 的型別
CS8604: ‘Shoe.Shoe(Style style, string color)’ 中的參數 ‘color’ 可能有 Null 參考引數。

Console.ReadLine() 指派給 color 會發生 CS8600
而又把這個 color 當作引數傳給 Shoe 物件就會發生 CS8604

解決辦法

使用 ?? 運算子

string color = Console.ReadLine() ?? "";

如果 color 是 null 就指派為空字串

CS8602 警告

CS8602: 可能 null 參考的取直 (dereference)

在鴨子的排序範例中,你可能會碰到 CS8602 警告
如果你使用自動實作 IComparer 介面的方法
它會很貼心地在方法的參數宣告可為 null 的型態
但如果將例如 intnull 比較,就會發生 CS8602 警告

解決辦法

先檢查參數是否為 null

請參考我修改的 DuckComparer

using System;
namespace Ducks
{
    public class DuckComparer : IComparer<Duck>
    {
        public SortCriteria SortBy = SortCriteria.SizeThenKind;

        public int Compare(Duck? x, Duck? y)
        {
            if (x == null)
            {
                return -1;
            }

            if (y == null)
            {
                return 1;
            }

            if (SortBy == SortCriteria.SizeThenKind)
            {
                if (x.Size > y.Size)
                {
                    return 1;
                }

                if (x.Size < y.Size)
                {
                    return -1;
                }

                if (x.Kind > y.Kind)
                {
                    return 1;
                }

                if (x.Kind < y.Kind)
                {
                    return -1;
                }

                return 0;
            }

            if (x.Kind > y.Kind)
            {
                return 1;
            }

            if (x.Kind < y.Kind)
            {
                return -1;
            }

            if (x.Size > y.Size)
            {
                return 1;
            }

            if (x.Size < y.Size)
            {
                return -1;
            }

            return 0;
        }
    }
}

ToString()

這是書中我覺得不錯的內容,寫給沒有買這本書的網友們
如果已經看完這本書的人,可以跳過這個部分

想必大家或多或少都看過 ToString()
你知道為什麼每個類別都有 ToString 方法嗎?
這是因爲當你建立一個類別時,它會從 Object 繼承 ToString 方法
Object 是頂層的基底類別,所有其他的類別都繼承它

你可以覆寫類別的 ToString 方法

using System;
namespace Ducks
{
    public class Duck
    {
        public override string ToString()
        {
            return "This is a duck.";
        }
    }
}

當你把物件當成字串輸出時就會看到自訂的 ToString() 格式

Duck duck = new Duck();
Console.WriteLine(duck); // This is a duck.

隨機 enum

這是我在網路上找到的隨機 enum 的方法
缺點是如果 enum 的 value 都一樣的話
那麼最終取得的 enum name 都會是同一個

T RandomEnum<T>()
{
    T[] values = (T[])Enum.GetValues(typeof(T));
    return values[new Random().Next(0, values.Length)];
}

Two Decks

這是一個有點大的練習,附錄只有英文版的關係,花了我不少時間閱讀
整體練習下來沒有太大的問題,也充分的練習整個章節的內容

Unity 實驗室

Unity 實驗室實現了一個簡易的遊戲,主要是讓讀者體驗寫 C# 腳本
遊戲是在畫面隨機產生撞球,撞球會隨機移動,玩家必須點擊撞球讓它消失
當畫面存在15顆撞球時,遊戲結束

遊戲選單
Game menu

遊戲畫面
Game scene

結論

附錄的最後,作者給了我們一段話,這算是解決專案的技巧

Breaking your project down into smaller parts gives you a chance to learn from each part and make changes along the way. It also gives you extra opportunities to find, sleuth out, and fix bugs.

將您的專案分解成更小的部分讓您有機會從每個部分中學習並在此過程中進行更改。它還為您提供了額外的機會來查找、偵查和修復錯誤。

參考

觀看次數: 1033
c#collectionenumenumerationlistqueuestackunity心得深入淺出列舉集合
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!