C# default 是什麼?有什麼用?

今天要說的不是 switch 中的 default
    
int i = 0;

switch (i)
{
   case 1:
       Console.WriteLine("1");
       break;
   default:
       Console.WriteLine("default");
       break;
}
    

而是資料型別中的預設值,有兩種用法,一個是自動推斷型別,另一個是手動指定型別:
    
int i = default;
int ii = default(int);

// output: 0
    

各資料型別的預設值可以直接參考微軟官網

簡單來說 default 就是預設值,依據不同資料型別會不同。可空類型的預設值都是 null,其他都是 0

常用的時間格式則是如下:
    
Console.WriteLine($"DateOnly: {default(DateOnly)}");
Console.WriteLine($"DateTime: {default(DateTime)}");
Console.WriteLine($"TimeOnly: {default(TimeOnly)}");

// DateOnly: 0001/1/1
// DateTime: 0001/1/1 上午 12:00:00
// TimeOnly: 上午 12:00
    

筆者最近看到有些比較特別的 default 使用方式:
    
DateOnly date = GetDateOnly("2022-07-05");
if (date != default)
    Console.WriteLine($"DateOnly: {date}");


DateOnly GetDateOnly(string date)
{
    if (string.IsNullOrWhiteSpace(date)) return default;
    return DateOnly.Parse(date);
}
    

上面的程式碼只是舉例,但主要就是將資料做一些處理,如果有問題就回傳 default,但是筆者覺得這樣比較難直接讀懂,並且每次都需要手動判斷是否為 default 。筆者覺得比較好的方式是使用 null,雖然一樣需要判斷,只是可空的型別編輯器會提醒你可能為空,而 default 不會。

使用 可為空的參考型別(Nullable) 調整後如下:
    
DateOnly? date = GetDateOnly("2022-07-05");
if (date != null)
    Console.WriteLine($"DateOnly: {date}");


DateOnly? GetDateOnly(string date)
{
    if (string.IsNullOrWhiteSpace(date)) return null;
    return DateOnly.Parse(date);
}
    

上面有提到可空型別的 default 就是 null,但是在比較長的程式碼中如果看到 return defaul 並不會很直覺的知道是回傳什麼,筆者通常也會使用 return null ,一看就明白。

所以筆者覺得唯一會使用到 default 的地方就是在定義物件時,標記該物件不會是空的:
    
public class Model
{
    public int Id { get; set; } = default!;
    public string Name { get; set; } = default!;
}
    

但是如果是這種情況筆者還是會選擇使用 null:
    
public class Model
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
}
    

在研究了一下後知道 default 可以用在哪裡,但是還是找不到適合用 default 的地方(因為私心覺得 null 更好), 有沒有網友可以替筆者解惑 default 適合用在什麼地方?

參考資料:
Microsoft.Learn - default value expressions - produce the default value

留言