試煉18 - 開始使用nameof吧

2022 鐵人賽文 搬回點部落

開始試煉

nameof 是消滅魔術字串 的好武器
我們先來看看下面的範例Code

void Main()
{
    var gil = new Gil(100);
    $"Gil Amount : {gil.Amount},CurrencyName : {gil.CurrencyName}".Dump();
    $"{nameof(Gil)} {nameof(Gil.Amount)} : {gil.Amount},{nameof(Gil.CurrencyName)} : {gil.CurrencyName}".Dump();
}
public class Gil
{
    public int Amount { get; set; }
    public string CurrencyName { get; } = "GD";
    public Gil(int amount)
    {
        Amount = amount;
    }
}

雖然一開始看到套nameof寫起來是很繁瑣但是 遇到修改的時候 用IDE重構後
當初寫nameof的價值就跑出來了
忽然間 老闆說Gil太冷門了 沒有知道那是貨幣於是重新命名
CurrencyName 太不專業 應該有更專業的名稱
就改成下面的範例Code

void Main()
{
    var gil = new GilCurrency(100);
    $"Gil Amount : {gil.Amount},CurrencyName : {gil.Acronym}".Dump();
    $"{nameof(GilCurrency)} {nameof(GilCurrency.Amount)} : {gil.Amount},{nameof(GilCurrency.Acronym)} : {gil.Acronym}".Dump();
}
public class GilCurrency
{
    public int Amount { get; set; }
    public string Acronym { get; } = "GD";
    public GilCurrency(int amount)
    {
        Amount = amount;
    }
}

這時候還要在去修改寫死的字串 如果是 nameof 就都不用改了 對吧

nameof VS ToString
先來看一下Code

void Main()
{
    nameof(Weapon.Sword).Dump();
    Weapon.Sword.ToString().Dump();
}
public enum Weapon
{
    Sword,
    Knife,
    Dagger,
}

結果都是產生Sword字串
但是還是有差異性

nameof是在編譯時就幫換成字串了 像是 const 常數那樣
ToString 就是執行時候的結果

結束試煉

寫C# 真的很方便 nameof 太棒了

參考
https://blog.darkthread.net/blog/enum-nameof-instead-of-string-constant/

如果內容有誤請多鞭策謝謝